关于python:多个Mixins和属性

Multiple Mixins and properties

我试图创建一个具有自己属性的mixin类,但是由于该类没有初始化属性后面的"hidden"变量的init。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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__()

所以上面是我想出来的解决这个问题的最好方法,但事实是这些卷并不真正属于这个基础。我可以在软件类中添加一个init,但是超级调用在两个mixin上都不起作用。

第二个问题是,我需要多个mixin,这取决于传入的调用,它们总是需要基础,但是mixin会发生变化,所以我不需要mixin中的变量来进行调用。

有没有一种方法可以让mixin把它的变量添加到类中,如果它是混合的,也许动态地调用mixin类的in it?.

有任何问题请告诉我。

谢谢


是的,太复杂了。类(包括mixin)应该只负责调用MRO中的下一个实现,而不是对所有实现进行编组。尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)