您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

超级可以处理多重继承吗?

超级可以处理多重继承吗?

使用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.frob
Foo.frob
Bar.frob
>>>

但是,当您尝试使用object实际具有的方法执行类似操作时,事情会变得有些混乱。object.__init__不带参数,因此使用它的唯一安全方法是不带参数调用super().__init__(),因为该调用 可能 由处理object.__init__。但是,它可能 不会 由处理object.__init__,而是由继承图中其他地方的类处理。因此,任何__init__在多重继承类层次结构中定义的类都必须准备好不带 参数 地被调用

一种解决方法是永远不要在中使用参数__init__()。进行最少的初始化,并在使用前依靠设置属性或使用其他方式配置新对象。但是,那真是令人不快。

另一种方法是仅使用关键字参数,例如,def __init__(self, **keywords):并始终删除适用于给定构造函数的参数。这是一种基于希望的策略,您 希望 所有关键词在控制权达到之前就被消耗掉object.__init__

第三种方式是定义一个超类中的所有其本身限定了多可继承碱基__init__在一些有用的方法和不 调用super().__init__object.__init__是无操作反正)。这意味着您可以 确保 始终调用方法,并且可以随心所欲地使用参数。

其他 2022/1/1 18:35:01 有470人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶