多个混合和属性
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
我正在尝试创建一个具有自己属性的混入 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