在BaseClass.__init__()运行以设置属性之前,无法访问self.config_array。在
修复FirstOrderSubClass以同时调用基类__init__,或者直接调用它。在
修复FirstOrderSubClass可能是最好的方法:class FirstOrderSubClass(BaseClass):
def __init__(self, name):
super(FirstOrderSubClass, self).__init__()
self.name = name
但是,您的__init__方法签名不匹配,因此您不能依赖于协作行为;一旦您在层次结构中添加了mix-in类,事情就可能并可能会中断。请参见Raymond Hettinger的*Python's ^{} is considered super!,或者它的后续文章PyCon presentation来解释为什么您希望您的签名匹配。在
直接调用BaseClass.__init__unbound方法(显式传入self)也可以:
^{pr2}$
请注意,如果您要让FirstOrderSubClass.__init__执行完全相同的操作,那么在那里分配self.name是没有意义的。在
使用super()的正确方法是让所有方法至少接受所有相同的参数。由于object.__init__()从来没有这样做,这意味着您需要一个不使用super();BaseClass的sentinel类在这里可以很好地工作。您可以使用*args和**kw捕获任何附加参数,而忽略这些参数就可以使协作子类化工作:class BaseClass(object):
def __init__(self, *args, **kw):
with open(config.txt) as f
self.config_array = f.readlines()
class FirstOrderSubClass(BaseClass):
def __init__(self, name, *args, **kw):
super(FirstOrderSubClass, self).__init__(*args, **kw)
self.name = name
class SecondOrderSubClass(FirstOrderSubClass):
def __init__(self, name, version, *args, **kw):
super(SecondOrderSubClass, self).__init__(name, *args, **kw)
self.version = version