如何在类内部引用自身(类似于递归函数)
对于一个递归函数,我们可以这样做:
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')
# ...
下面是相关的参考资料: