【发布时间】:2020-03-09 12:50:20
【问题描述】:
我是Python新手,对超级函数和多重继承真的很困惑。
这是玩具代码:
class A():
def __init__(self):
print('Call class A')
print('Leave class A')
class C(A):
def __init__(self):
print('Call class C')
A.__init__(self)
print('Leave class C')
class D(A):
def __init__(self):
print('Call class D')
#A.__init__(self)
super(D,self).__init__()
print('Leave class D')
class B(A):
def __init__(self):
print('Call class B')
super(B,self).__init__()
print('Leave class B')
class E(C,B,D):
def __init__(self):
print('Call class E')
B.__init__(self)
#C.__init__(self)
#D.__init__(self)
print('Leave class E')
那么输出是:
Call class E
Call class B
Call class D
Call class A
Leave class A
Leave class D
Leave class B
Leave class E
(<class '__main__.E'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
其中调用了 D 类的 __init__。但是,如果我将 E 类更改为:
class E(B,C,D):
def __init__(self):
print('Call class E')
B.__init__(self)
#C.__init__(self)
#D.__init__(self)
print('Leave class E')
如果B、C、D的顺序改变了,那么输出是:
Call class E
Call class B
Call class C
Call class A
Leave class A
Leave class C
Leave class B
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
那么D类的__init__不会被调用,而是C类的,虽然类没有使用super函数。
有人知道吗:
1、在第一个代码中,为什么还要调用D类的__init__?
2、第二个代码为什么调用了C类的__init__而没有调用D类的__init__?
【问题讨论】:
-
这与PyTorch无关,这是一个纯Python问题。问题是用另一个类实例作为参数调用一个类的 init,这是没有意义的,并且是奇怪行为的原因。
-
你必须在层次结构中一致地使用
super(这就是为什么我们说super支持cooperative继承)。 -
观看此演讲以了解有关继承和 super() 的所有信息:youtube.com/watch?v=EiOglTERPEo
-
@Dese 不,这在 Python 中很正常,而且非常有意义。事实上,这是您在
super可用之前必须 做的事情,如果您不尝试使用协作多重 继承,这完全没问题。 -
@juanpa.arrivillaga 确实我应该更明确一点:如果你也使用 super 就不要这样做
标签: python multiple-inheritance super