我想使用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是否可以,这是一个单独的问题)
相关:
我建议将其放入__init__()Mixin 中。您认为缺点是什么?
class Mixin(object):
def __init__(self, *args, **kwargs):
super(Mixin, self).__init__(*args, **kwargs)
self.items = []
Run Code Online (Sandbox Code Playgroud)
我认为这是正确的做法;所有其他(也许有效)的解决方案对我来说都像是一个黑客。