使用
super(),
__init__()以及多重继承是有点棘手。
在正常情况下, 每个 方法都调用
super(),而类仅继承自
object做一些额外的工作以确保该方法确实存在:它看起来像这样:
>>> class Foo(object):... def frob(self, arg):... print "Foo.frob"... if hasattr(super(Foo, self), 'frob'):... super(Foo, self).frob(arg)... >>> class Bar(object):... def frob(self, arg):... print "Bar.frob"... if hasattr(super(Bar, self), 'frob'):... super(Bar, self).frob(arg)... >>> class Baz(Foo, Bar):... def frob(self, arg):... print "Baz.frob"... super(Baz, self).frob(arg)... >>> b = Baz()>>> b.frob(1)Baz.frobFoo.frobBar.frob>>>
但是,当您尝试使用
object实际具有的方法执行类似操作时,事情会变得有些混乱。
object.__init__不带参数,因此使用它的唯一安全方法是不带参数调用
super().__init__(),因为该调用 可能
由处理
object.__init__。但是,它可能 不会 由处理
object.__init__,而是由继承图中其他地方的类处理。因此,
任何
__init__在多重继承类层次结构中定义的类都必须准备好不带 参数 地被调用。
一种解决方法是永远不要在中使用参数
__init__()。进行最少的初始化,并在使用前依靠设置属性或使用其他方式配置新对象。但是,那真是令人不快。
另一种方法是仅使用关键字参数,例如,
def __init__(self,**keywords):并始终删除适用于给定构造函数的参数。这是一种基于希望的策略,您 希望
所有关键词在控制权达到之前就被消耗掉
object.__init__。
第三种方式是定义一个超类中的所有其本身限定了多可继承碱基
__init__在一些有用的方法和不 不
调用
super().__init__(
object.__init__是无操作反正)。这意味着您可以 确保
始终调用此方法,并且可以随心所欲地使用参数。



