超级python问题

时间:2015-05-20 13:09:44

标签: python

我正在尝试学习一些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。

2 个答案:

答案 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的工作原理(尽管它的名称,它必须在类的父级上调用方法),这是调用在以下情况下正常工作所必需的多重继承。