8

我想为使用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__通常,我会在__init__.

我可以执行以下操作:

class Mixin:
    items = None

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

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

有什么选择吗?或者也许添加__init__到 mixin 是方法?

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

相关

4

2 回答 2

4

I would propose to put that in an __init__() of the Mixin. What do you think is the disadvantage?

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

I think this is right way to do it; all other (maybe working) solutions look like a hack to me.

于 2013-05-24T09:14:51.500 回答
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
于 2013-05-24T09:14:04.123 回答