多个Mixins和属性

时间:2016-09-13 12:14:59

标签: python mixins

我正在尝试创建一个具有自己属性的mixin类,但由于该类没有 init 来初始化属性后面的“隐藏”变量。

class Software:

    __metaclass__ = ABCMeta

    @property
    def volumes(self):
        return self._volumes

    @volumes.setter
    def volumes(self, value):
        pass

class Base(object):

    def __init__(self):
        self._volumes = None

class SoftwareUser(Base, Software):

    def __init__(self):
        super(Base, self).__init__()

所以上面是我提出来解决这个问题的最好方法,但实际情况是_volumes并不真正属于基础。我可以在软件类中添加一个init,但是超级调用不会对两个mixin都有效。

第二个是我需要多个mixin依赖于它们总是需要基数的传入调用,但是mixins会改变所以我真的不希望mixin中的变量没有被混合用于该调用。

有没有一种方法可以让mixin将它的变量添加到类中,如果它混合在一起可能动态调用mixin类的init?。

有任何问题让我知道。

由于

2 个答案:

答案 0 :(得分:1)

是的,这太过于复杂了。类(包括mixins)应该只负责调用MRO中的 next 实现,而不是编组所有这些实现。尝试:

class Software:

    @property
    def volumes(self):
       return self._volumes

    @volumes.setter
    def volumes(self, value):
       pass

    def __init__(self):
        self._volumes = None
        super().__init__()  # mixin calls super too


class Base(object):

    def __init__(self):
        other_vars = None


class SoftwareUser(Software, Base):  # note order

    def __init__(self):
        super().__init__()  # all you need here

答案 1 :(得分:0)

好的,所以这就是我想出来的,如果我已经这样做了,那么我愿意接受其他答案。

class Software:

    @property
    def volumes(self):
       return self._volumes

    @volumes.setter
    def volumes(self, value):
       pass

    def __init__(self):
        self._volumes = None


class Base(object):

    def __init__(self):
        other_vars = None


class SoftwareUser(Base, Software):

    def _bases_init(self, *args, **kwargs):
        for base in type(self).__bases__:
            base.__init__(self, *args, **kwargs)

    def __init__(self, *args, **kwargs):
        self._bases_init(*args, **kwargs)