2016-04-28 61 views
0

这里是我的简化代码:当我绑定到AliasProperty时会发生什么?

class Player(Widget): 
    _health = NumericProperty(100) 

    def _get_health(self): 
     return self._health 

    health = AliasProperty(_get_health, bind=['_health']) 

我这样做是为了使health '只读'。

奇怪的是,当我删除bind=['_health']时,它不起作用。

所以我的问题是:bind=['_health']实际上做了什么?我知道AliasProperty允许我定义一个getter和可选setter,它在该属性被访问时运行(类似于Python的@property)。

那么在这种情况下,为什么bind=['_health'],以及为什么该属性不起作用(不反映底层_health的状态)?

回答

1

bind自变量告诉属性引擎哪个其他属性要监视更改,因为它们与AliasProperty正在考虑的相关。

让我们从文档的(简化的)例子:

def get_right(self): 
    return self.x + self.width 
right = AliasProperty(get_right, bind=['x', 'width']) 

这里,right依赖于其他两个属性。如果我们只写了bind=['x'],那么只有改变x将导致触发为right更改事件,而到width变化将被忽略(但是,如果改变width后更改x发生,与预期值的事件将被解雇,如果该值是手动检索,那么也是正确的)。

+0

我明白了。当'right''改变'时,除非我们明确指定我们依赖于'x'和'width',否则什么也不知道,在这种情况下,当别名属性改变时会引发别名属性事件。 谢谢:) –