多个混合和属性

Multiple Mixins and properties

我正在尝试创建一个具有自己属性的混入 class,但是由于 class 没有 init 来初始化 "hidden"变量后面的属性.

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 class,但是 super 调用不会在两个 mixins 上工作。

第二个是,我将需要多个 mixins,具体取决于传入的调用,它们将始终需要 base,但是 mixins 会发生变化,所以我真的不想要来自 mixins 的变量,这些变量没有为该调用混合。

有没有办法让 mixin 将它的变量添加到 class 中,如果它被混合,也许动态调用 mixin 的初始化 class?

有任何问题请告诉我。

谢谢

好的,这就是我想出的,如果我把这种方式弄得过于复杂,我愿意接受其他答案。

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)

是的,这太复杂了。 class(包括混合)应该只负责调用 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