初始化mixin中的实例变量

2024-04-25 21:07:34 发布

您现在位置: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__。在

我可以做以下事情:

^{pr2}$

但这种情况是在每个append上进行评估的,它似乎不是最干净的解决方案。在

有其他选择吗?或者在mixin中添加__init__是一种方法?在

(是否可以使用mixin是另一个问题)

相关


Tags: 方法self功能fooinit状态defdisplay
2条回答

最干净的解决方案是添加一个__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

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

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

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

相关问题 更多 >