在mixin中初始化实例变量

Jak*_* M. 7 python

我想使用mixin为类提供一些功能.该功能使用一些额外的每对象状态.我想知道什么是最简洁的初始化本地状态的方法.考虑这个例子:

class Mixin:
    items = []
    def append(self, x):
        self.items.append(x)
    def display(self):
        print self.items

class Foo(object, Mixin): pass
class Bar(object, Mixin): pass

foo = Foo()
foo.append('foo')
foo.display()

>>> ['foo']

bar = Bar()
bar.append('bar')
bar.display()

>>> ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

这里,状态是items列表.在Mixin体中初始化它显然是错误的.通常情况下,我会把它初始化__init__,但是对于Mixin,我不想搞砸__init__.

我可以做以下事情:

class Mixin:
    items = None

def append(self, x):
    if self.items is None:
        self.items = []
    self.items.append(x)
Run Code Online (Sandbox Code Playgroud)

但是每种情况append都要对这个条件进行评估,它似乎并不是最干净的解决方案.

任何替代品?或者也许添加__init__到mixin是方式?

(如果使用mixins是否可以,这是一个单独的问题)

相关:

Alf*_*lfe 4

我建议将其放入__init__()Mixin 中。您认为缺点是什么?

class Mixin(object):
    def __init__(self, *args, **kwargs):
        super(Mixin, self).__init__(*args, **kwargs)
        self.items = []
Run Code Online (Sandbox Code Playgroud)

我认为这是正确的做法;所有其他(也许有效)的解决方案对我来说都像是一个黑客。

  • 您可以在 Python 3 中省略该对象,但无论如何都要包含它,因此您的代码也可以在 Python 2 上运行。 (2认同)