栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

使用

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__
是无操作反正)。这意味着您可以 确保
始终调用此方法,并且可以随心所欲地使用参数。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645397.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号