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

2 投票
2 回答
5258 浏览
提问于 2025-04-17 05:53

我的问题可能通过代码更容易理解。我想做以下事情:

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'

撰写回答