Python 当 final class 没有 __init__ 时不调用 mixin 构造函数
Python mixin constructor not called when final class has no __init__
最终 class 用户可能想要创建一个 class 由 Base
和 Mixin
组成(Mixin
提供了比第 3 方库更多的通用功能classes).
但是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__
,而不需要用户记住在 C class 中放置一个带有 super()
调用的构造函数?
>>> 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 不会像这样自动链接任何方法调用,因此您需要遵守纪律并正确使用合作继承。如果一个 class 使用 super
,则所有 class 必须使用 super
。 (这是一个简单的案例,因为覆盖的 __init__
方法中的 none 添加了任何额外的参数。如果他们这样做了,您需要做一些工作来确保 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
的工作原理,而 而不是 将其视为对您的 [=31= 的简单间接引用的完美示例]的基础class.)
如果您无法修改 Base
或 Mixin
以使用 super
,那么您将需要围绕它们定义可以修改的包装器。链接的文章解释了如何。
最终 class 用户可能想要创建一个 class 由 Base
和 Mixin
组成(Mixin
提供了比第 3 方库更多的通用功能classes).
但是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__
,而不需要用户记住在 C class 中放置一个带有 super()
调用的构造函数?
>>> 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 不会像这样自动链接任何方法调用,因此您需要遵守纪律并正确使用合作继承。如果一个 class 使用 super
,则所有 class 必须使用 super
。 (这是一个简单的案例,因为覆盖的 __init__
方法中的 none 添加了任何额外的参数。如果他们这样做了,您需要做一些工作来确保 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
的工作原理,而 而不是 将其视为对您的 [=31= 的简单间接引用的完美示例]的基础class.)
如果您无法修改 Base
或 Mixin
以使用 super
,那么您将需要围绕它们定义可以修改的包装器。链接的文章解释了如何。