几个Kivy属性的继承

时间:2019-06-13 17:04:14

标签: python kivy

假设我有2个奇异果属性

  • 第一个属性负责确保该值在某个范围内(例如,从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)四舍五入 同时。

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

1 个答案:

答案 0 :(得分:0)

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

您可以通过多种方式执行此操作,但我不清楚您在做什么,因此什么是最佳选择。在最简单的情况下,您可以只将舍入功能添加到MyBoundedNumericProperty中,但我不清楚您是否真的希望在单独的属性中使用该功能。更加灵活的选择是使混合像小部件一样,可能会覆盖属性的__set__方法。