假设我有2个奇异果属性
class MyBoundedProperty(BoundedNumericProperty):
def __init__(self, *largs, **kw):
self._my_min = kw.get('min', 0) # 0 is default
self._my_max = kw.get('max', 1.) # 1 is default
kw['min'] = self._my_min
kw['max'] = self._my_max
kw['errorhandler'] = self._my_errorhandler
super().__init__(*largs, **kw)
def _my_errorhandler(self, x):
return min(max(x, self._my_min), self._my_max)
class MyAliasProperty(AliasProperty):
_data = 0
def __init__(self, **kwargs):
kwargs['getter'] = self._getter
kwargs['setter'] = self._setter
super().__init__(**kwargs)
def _getter(self, obj):
return self._data
def _setter(self, obj, value):
if type(value) is int:
value = float(value)
if type(value) is float:
self._data = round(value, 5)
else:
raise ValueError('{}.{} has an invalid format (got {!r})'.format(
obj.__class__.__name__, self.name, value))
return True # Value changed, dispatch event
我希望能够在创建新属性时重用这些属性,因为我通过小部件行为来做到这一点。 例如: x = MyProperty(MyBoundedProperty,MyAliasProperty)
这意味着x的值应为 1)在指定的限制(最小和最大)内 2)四舍五入 同时。
我想澄清-我的任务是不使用不同的属性(例如,可能是几个Alias属性)。我的任务是能够重用先前创建的属性以制作复合属性。
有没有办法做到这一点?
PS,让我澄清一下。 例如:
class MyRoundProperty(AliasProperty):
_data = 0.
def __init__(self, **kwargs):
kwargs['getter'] = self._getter
kwargs['setter'] = self._setter
super().__init__(**kwargs)
def _getter(self, obj):
return self._data
def _setter(self, obj, value):
if type(value) is int:
value = float(value)
if type(value) is float:
pass
self._data = round(value, 5)
else:
raise ValueError('{}.{} has an invalid format (got {!r})'.format(
obj.__class__.__name__, self.name, value))
return True # Value changed, dispatch event
class MyBoundProperty(AliasProperty):
_data = 0.
_min = 0.
_max = 1.
def __init__(self, **kwargs):
self._min = kwargs.pop('min', 0.) # 0 is default
self._max = kwargs.pop('max', 1.) # 1 is default
kwargs['getter'] = self._getter
kwargs['setter'] = self._setter
super().__init__(**kwargs)
def _getter(self, obj):
return self._data
def _setter(self, obj, value):
if type(value) is int or float:
value = min(max(value, self._min), self._max)
self._data = value
else:
raise ValueError('{}.{} has an invalid format (got {!r})'.format(
obj.__class__.__name__, self.name, value))
return True # Value changed, dispatch event
这有效:
class MyProperty(MyRoundProperty):
pass
这可行:
class MyProperty(MyBoundProperty):
pass
但是这个
class MyProperty(MyRoundProperty, MyBoundProperty):
pass
仅具有MyRoundProperty的功能,我希望MyProperty具有两个类的行为
答案 0 :(得分:0)
这看起来像是“不,但是是”的情况。不,您可能无法毫无问题地从多个属性继承,它们将在管理其内部状态时发生冲突。但是,是的,您可能可以以合理的方式实现您真正想要的。
您可以通过多种方式执行此操作,但我不清楚您在做什么,因此什么是最佳选择。在最简单的情况下,您可以只将舍入功能添加到MyBoundedNumericProperty
中,但我不清楚您是否真的希望在单独的属性中使用该功能。更加灵活的选择是使混合像小部件一样,可能会覆盖属性的__set__
方法。