我想使用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']
这里,状态是项目列表.在Mixin体中初始化它显然是错误的.通常情况下,我会在__init__中初始化它,但是对于Mixin,我不想弄乱__init__.
我可以做以下事情:
class Mixin:
items = None
def append(self,x):
if self.items is None:
self.items = []
self.items.append(x)
但是对每个附加物评估条件,它似乎不是最干净的解决方案.
任何替代品?或者可能在mixin中添加__init__是这样的?
(如果使用mixins是否可以,这是一个单独的问题)
有关:
> Initializing instance variables in Mixins for Ruby
最佳答案
我建议把它放在Mixin的__init __()中.您认为缺点是什么?
class Mixin(object):
def __init__(self,*args,**kwargs):
super(Mixin,self).__init__(*args,**kwargs)
self.items = []
我认为这是正确的做法;所有其他(可能正在工作)的解决方案看起来像是对我的黑客攻击.