gpt4 book ai didi

python - Kivy的几个属性的继承

转载 作者:太空宇宙 更新时间:2023-11-03 20:46:14 24 4
gpt4 key购买 nike

假设我有 2 个 kivy 属性

  • 第一个属性负责确保值位于特定范围内(例如,从 0 到 1) - 我为此使用 BoundedNumericProperty
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)
  • 第二个属性负责确保值始终四舍五入到五阶 (AliasProperty)
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) 四舍五入到第 5 阶同时。

我想澄清一下 - 我的任务不是使用不同的属性(例如,可能是多个 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 具有这两个类的行为

最佳答案

这看起来像是一个“不,但是是”的情况。不,您可能无法毫无问题地继承多个属性,它们在管理其内部状态时会发生冲突。但是,是的,您可能可以通过合理的方式实现您真正想要的。

您可以通过多种方式来做到这一点,我不太清楚您在做什么以及因此什么是最好的选择。在最简单的情况下,您只需将舍入功能添加到 MyBoundedNumericProperty 中即可。 ,我不清楚您是否真的想要在单独的属性中使用该功能。一个更灵活的选择是制作一个类似于小部件行为的 mixin,可能会覆盖 __set__属性的方法。

关于python - Kivy的几个属性的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com