python – 在mixin中初始化实例变量

前端之家收集整理的这篇文章主要介绍了python – 在mixin中初始化实例变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想使用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 = []

我认为这是正确的做法;所有其他(可能正在工作)的解决方案看起来像是对我的黑客攻击.

猜你在找的Python相关文章