你如何在Python中递归调用构造函数(__init__)?

时间:2011-11-08 18:30:30

标签: python recursion

我的问题可能最容易在代码中看到。我想做以下

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 个答案:

答案 0 :(得分: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'

答案 1 :(得分:3)

以递归方式调用“构造函数”(实际上是初始值设定项;请参阅here):

class A():
    def __init__(self, i):
        self.i = i
        if i > 0:
           self.__init__(i-1)

但我怀疑这不是你打算做的。您的示例代码以递归方式创建类型A的实例并将它们存储在彼此中。