如何在Python中递归调用构造函数(__init__)?
我的问题可能通过代码更容易理解。我想做以下事情:
class A():
def __init__(self, i):
self.i = i
if i > 0:
self.a = A(i-1)
我的想法是,我想创建一个类型为A的类,这个类可以递归地调用它自己的构造函数。如果我按照上面的代码去写,并尝试创建A的一个实例,我会得到以下结果:
a = Test(3)
---> self.a = A(i-1)
NameError: global name 'A' is not defined
有没有可能让一个类递归地调用它自己的构造函数?如果可以的话,应该怎么做呢?
2 个回答
3
要递归地调用“构造函数”(其实是一个初始化器;具体可以看这里),你可以这样做:
class A():
def __init__(self, i):
self.i = i
if i > 0:
self.__init__(i-1)
不过我觉得这可能不是你想要的效果。你的示例代码是在递归地创建类型为A
的实例,并把它们存储在彼此里面。
4
我这边用 a = A(3)
运行得很好,你的 a = Test(3)
是怎么回事呢?我猜这可能是问题所在。如果你把你的类命名为 Test
,那么你应该用 self.a = Test(i-1)
这样的写法。
>>> class A():
... def __init__(self, i):
... self.i = i
... if i > 0:
... self.a = A(i-1)
...
>>> a = A(3)
>>> a.i
3
>>> a.a.i
2
>>> a.a.a.i
1
>>> a.a.a.a.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'a'