【发布时间】:2013-12-01 14:45:52
【问题描述】:
我不明白为什么在下面的代码中只初始化了一个父构造函数:
class Base(object):
def __init__(self):
print "Base::Base():"
class BaseWArgs(object):
def __init__(self, arg):
print "BaseWArgs::BaseWArgs(%s):" % arg
class Composite(Base, BaseWArgs):
def __init__(self):
super(Composite,self).__init__()
在这种情况下,只有 Base.init() 被调用。如果我切换继承参数的顺序,只有whatever-stands-first类被初始化:
class Composite(BaseWArgs, Base):
def __init__(self):
super(Composite,self).__init__('myArg')
如何通过一个电话初始化两个父母?这不应该是super()的责任吗?
编辑 我认为我的用例是多重继承的一个特例。我想使用 defaultdict 作为基本类型创建一个项目,但从第三种类型继承一些额外的功能。
from collections import defaultdict
class Base(object):
def __init__(self):
print "Base::Base():"
super(Base,self).__init__()
self.val = 'hello world'
class Item(defaultdict, Base):
def __init__(self):
super(Item,self).__init__(int)
>>> Item()
defaultdict(<type 'int'>, {})
>>> Item().val
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
Item().val
AttributeError: 'Item' object has no attribute 'val'
Base::Base() 在哪里迷路了?为什么Base没有初始化?
【问题讨论】:
-
在任何人开始链接到“超级有害”的东西之前:Python’s super() considered super!
-
您必须使用两次
super。super只是遍历__mro__(方法解析顺序)以找到要调用的方法,但它总是找到一个方法,即第一个方法层次结构。 -
@Bakuriu 使用
super()两次调用相同的Base.__init__()两次。 -
你应该阅读新的python类和继承,这是因为python不会搜索它首先靠近的所有父母。
-
@PavloDyban 阅读我的评论。我有没有说过两次使用相同的参数调用
super?我显然打算调用super两次,使用不同的参数来获得这两个方法。
标签: python python-2.7 initialization multiple-inheritance