如何在类内部引用自身(类似于递归函数)

54 投票
13 回答
57108 浏览
提问于 2025-04-15 17:50

对于一个递归函数,我们可以这样做:

def f(i):
  if i<0: return
  print i
  f(i-1)

f(10)

不过有没有办法做到以下这个呢?

class A:
  # do something
  some_func(A)
  # ...

13 个回答

16

你提到的这种特定写法是行不通的,原因在于它们被评估的时间。给出的例子函数之所以能工作,是因为在函数体内调用 f(i-1) 时,f 的名字解析是在函数真正被调用的时候才进行的。这个时候,f 已经在执行的范围内,因为函数已经被评估过了。而在类的例子中,类名的引用是在类定义还在被评估的时候就被查找了。因此,这个时候它在本地范围内还不存在。

另外,你想要的效果可以通过使用元类来实现,像这样:

class MetaA(type):

    def __init__(cls):
        some_func(cls)

class A(object):
    __metaclass__=MetaA
  # do something
  # ...

使用这种方法,你可以在类被评估的时候对类对象进行任意操作。

21

在Python中,你不能在类的内部直接引用这个类本身,不过在像Ruby这样的语言中是可以的。

在Python中,你可以使用类装饰器,但这个装饰器会在类初始化后才被调用。另一种方法是使用 metaclass(元类),但这要看你想要实现什么功能。

46

如果我理解你的问题没错的话,你应该可以在类A内部引用类A,只需要把类型注解用引号括起来。这种做法叫做前向引用。

class A:
  # do something
  def some_func(self, a: 'A')
  # ...

下面是相关的参考资料:

  1. https://github.com/python/mypy/issues/3661
  2. https://www.youtube.com/watch?v=AJsrxBkV3kc

撰写回答