加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 21:51:33 所属栏目:Python 来源:网络整理
导读:我想使用mixin为类提供一些功能.该功能使用一些额外的每对象状态.我想知道什么是最简洁的初始化本地状态的方法.考虑这个例子: class Mixin: items = [] def append(self,x): self.items.append(x) def display(self): print self.itemsclass Foo(object,Mix

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读