我正在尝试创建一个具有自己属性的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?。
有任何问题让我知道。
由于
答案 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)