在mixin中初始化实例变量

时间:2013-05-24 09:09:27

标签: 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']

此处,状态为items列表。在Mixin体中初始化它显然是错误的。通常情况下,我会在__init__初始化它,但是使用Mixin我不想弄乱__init__

我可以做以下事情:

class Mixin:
    items = None

def append(self, x):
    if self.items is None:
        self.items = []
    self.items.append(x)

但是对每个append评估条件,它似乎不是最干净的解决方案。

任何替代方案?或者可能将__init__添加到mixin中就是这样吗?

(如果使用mixins是好的话,这是一个单独的问题)

相关

2 个答案:

答案 0 :(得分:4)

我建议把它放在Mixin的__init__()中。您认为缺点是什么?

class Mixin(object):
    def __init__(self, *args, **kwargs):
        super(Mixin, self).__init__(*args, **kwargs)
        self.items = []

我认为这是正确的做法;所有其他(可能正在工作)的解决方案看起来像是对我的黑客攻击。

答案 1 :(得分:0)

最干净的解决方案是添加__init__方法并在每个方法中使用super()来确保每个方法都被调用。

class Mixin:
    def __init__(self, *args, **kwargs):
        self.items = []
        super(Mixin, self).__init__(*args, **kwargs)
    def append(self, x):
        self.items.append(x)
    def display(self):
        print self.items