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) |