gpt4 book ai didi

当最终类没有 __init__ 时不调用 Python mixin 构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:14 26 4
gpt4 key购买 nike

最终类用户可能希望创建一个由 BaseMixin 组成的类(Mixin 提供了比第 3 方库类更多的通用功能).

但是 Mixin.__init__ 在如下使用时不会被调用。只有 Base.__init__ 被调用:

>>> class Base(object): #3rd party library class
... def __init__(self): print "Base"
...
>>> class Mixin(object): #my features useful as addendum for a few classes
... def __init__(self): print "Mixin"
...
>>> class C(Base, Mixin): pass
...
>>> c = C()
Base

如何在这种情况下强制调用 Mixin.__init__Base.__init__ 而无需用户记住使用 super()< 放置构造函数 在 C 类中调用?

>>> class Base(object):
... def __init__(self): print "Base"
...
>>> class Mixin(object):
... def __init__(self): print "Mixin"
...
>>> class C(Base, Mixin):
... #easy to forget to add constructor
... def __init__(self): super(C, self).__init__()
...
>>> c = C()
Base
Mixin

最佳答案

Python 不会像这样自动链接任何方法调用,因此您需要遵守纪律并正确使用合作继承。如果一个类使用super,那么所有类都必须使用super。 (这是一个简单的例子,因为没有一个被覆盖的 __init__ 方法添加任何额外的参数。如果他们添加了,你需要做一些工作来确保 object.__init__一旦被调用,就不会收到额外的参数。)

阅读https://rhettinger.wordpress.com/2011/05/26/super-considered-super/在继续之前。

class Base(object):
def __init__(self):
print "Base"
super(Base, self).__init__()

class Mixin(object):
def __init__(self):
print "Mixin"
super(Mixin, self).__init__()

class C(Base, Mixin):
pass

c = C()

(这也是为什么您需要了解 super 的工作原理,并且将其视为对您类的基类的简单间接引用的一个完美示例。)

如果您不能修改 BaseMixin 以使用 super,那么您需要在它们周围定义可以修改的包装器。链接的文章解释了如何操作。

关于当最终类没有 __init__ 时不调用 Python mixin 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34998691/

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