python与super的关系

python与super的关系,python,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 clas

我试图学习一些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。

您将错误的类传递给了对
super
的调用。调用
super
返回一个代理对象,其MRO(方法解析顺序)由作为第一个对象传递的类之后的类组成。以下是每个班级的MRO:

>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

由于
super
的工作方式(尽管它的名称不同,但它不一定调用类的父级上的方法),这是在多重继承的情况下调用正常工作所必需的。

您将错误的类传递给了
super
的调用。调用
super
返回一个代理对象,其MRO(方法解析顺序)由作为第一个对象传递的类之后的类组成。以下是每个班级的MRO:

>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

由于
super
的工作方式(尽管它的名称不同,但它不一定调用类的父级上的方法),在多重继承的情况下,这是调用正常工作所必需的。

您正在执行
super(a,self)。\uuu init\uuuu()
它应该是
super(B,self)。\uu init\uuu()
您正在执行
super(A,self).\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu如果您使用的是Python 3,最简单的方法是省略super:
super()。\uuu init\uuu()
@AlexDicianu,我很高兴它对您有所帮助。如果它解决了您的问题,请随意接受我的答案:D@AlexDicianu我很高兴它有帮助。如果它解决了你的问题,请随意接受我的答案:D