循环继承?什么?
我最近在玩Python,但对这个情况有点搞不懂。
我开始写这些类,顺序是这样的……下面的注释是我对发生事情的理解:
# class A1 inherits object
class A(object):
pass
# class B1 inherits A1, object
class B(A):
def a(self):
print "b",
super(B, self).a()
# class A2 inherits B1, A1, object
class A(B):
def a(self):
print "a",
super(A, self).a()
# class B2 inherits A2, B1, A1, object
class B(A):
def a(self):
print "b",
super(B, self).a()
当我创建一个的实例,也就是
>>> a = A()
>>> a.a()
a b
Traceback (most recent call last):
File "<pyshell#263>", line 1, in <module>
a.a()
File "<pyshell#258>", line 4, in a
super(A, self).a()
File "<pyshell#256>", line 4, in a
super(B, self).a()
TypeError: super(type, obj): obj must be an instance or subtype of type
我原以为会出现错误(就像Kevin说的那样),错误信息会是AttributeError: A instance has no attribute 'a'
,因为我预期
更奇怪的是,当我现在创建一个的实例时,结果更加意外……
>>> b = B()
>>> b.a()
b a b a b a b a b a b a b a b a b a b a b a b a b a b a b a b a b a b a b a b a ...
这难道不应该像那样崩溃吗?只是多了一个函数而已?怎么会这样?
1 个回答
1
在创建了类 A2
和类 B2
之后,下面的代码:
super(B, self).a()
super(A, self).a()
在所有类的函数中,分别使用类型 A2
和 B2
,比如 A2.a
、B1.a
、B2.a
等等。
这意味着当我调用 A2.a
时,父类会调用基类 B1.a
。在 B1.a
中,这个函数试图使用 super
函数,传入类型 B2
和一个 A2
的实例,这样就会出现一个错误,提示 obj 必须是类型的实例或子类型
。
当我调用 B2.a
时,父类会先调用 A2.a
,然后再调用 B1.a
。在调用 super
时,传入类型 B2
和一个 B2
的实例,这又会再次调用 A2.a
函数……这样就会无限循环,直到出现递归错误!
所以看起来像是循环继承,但实际上只是两个循环函数在特定参数下的表现。