gpt4 book ai didi

python - Super可以处理多重继承吗?

转载 作者:太空狗 更新时间:2023-10-29 18:30:54 27 4
gpt4 key购买 nike

像这样从两个对象继承时

class Foo(object):
def __init__(self,a):
self.a=a

class Bar(object):
def __init__(self,b):
self.b=b

我通常会做这样的事情

class FooBar(Foo,Bar):
def __init__(self,a,b):
Foo.__init__(self,a)
Bar.__init__(self,b)

super 怎么知道我是否想调用两者?如果是这样,它将如何知道将哪个参数传递到哪里。还是根本不可能在这里使用 super?

即使 Foo 和 Bar 采用相同的参数,super 也能处理这个问题吗?

或者我一开始就不应该尝试这样做吗?

最佳答案

使用 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__(),因为调用 < em>可能 由object.__init__ 处理。但是它可能object.__init__ 处理,而是由继承图中其他地方的类处理。因此,在多继承类层次结构中定义 __init__任何类必须准备好在无参数的情况下调用。

处理此问题的一种方法是永远不要在 __init__() 中使用参数。进行最少的初始化,并在使用前依靠设置属性或使用其他方式配置新对象。不过,这很不愉快。

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

第三种方法是为所有可多重继承的基类定义一个父类(super class),它本身以某种有用的方式定义了 __init__ 并且调用 super( ).__init__(object.__init__ 无论如何都是空操作)。这意味着您可以确定此方法始终是最后调用的,并且您可以随心所欲地处理参数。

关于python - Super可以处理多重继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903398/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com