python与super的关系
我试图学习一些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
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