我正在尝试学习一些python,新的样式类构造函数似乎没有使用super。
class A(object):
def __init__(self):
print 'Hello A'
class B(A):
def __init__(self):
print 'Hello B'
super(A, self).__init__()
a = A();
b = B();
当我运行此程序时,我得到以下内容:
$ python classa.py
Hello A
Hello B
应该说
Hello A
Hello B
Hello A
我在这里做错了什么?我在Mac上使用python 2.7.6。
答案 0 :(得分:4)
您正在super(A, self).__init__()
它应该是super(B, self).__init__()
答案 1 :(得分:1)
您正在将错误的班级传递给super
。对super
的调用返回一个代理对象,其MRO(方法解析顺序)由作为第一个对象传递的类之后的类组成。以下是每个班级的MRO:
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
当您致电super(A, self).__init__
时,您实际上是在调用object.__init__
,而不是A.__init__
。 object.__init__
不会向屏幕输出任何内容。
将呼叫更改为super(B, __init__)
会导致A.__init__
在您的示例中运行。
顺便提一下,好的设计要求如果在层次结构的一个类中使用super
,则需要在 all 层次结构中的类中调用它。
class A(object):
def __init__(self):
super(A, self).__init__()
print 'Hello A'
class B(A):
def __init__(self):
print 'Hello B'
super(A, self).__init__()
由于super
的工作原理(尽管它的名称,它不必须在类的父级上调用方法),这是调用在以下情况下正常工作所必需的多重继承。