我想使用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是好的话,这是一个单独的问题)
相关:
答案 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