如何使用traitlets库观察实例成员变量?

时间:2018-03-28 13:29:03

标签: python-3.x ipython traits

我正在尝试在我的代码中使用ipython提供的traitlets库。假设一个特征是特定类的实例,我如何观察该类成员的值的变化。

示例:

class A:
    def init(self,val):
    self.value = val

class myApp(HasTraits):
    myA = Instance(A,kw={'val':2})

如果'值'我希望调用一个观察方法。对象myA的成员变量已更改..如下所示:

@observe('myA.value')
def onValueChange(self,change):
    return

是否可以实施trailets?

1 个答案:

答案 0 :(得分:1)

为了观察实例特征值的变化,实例特征的类应该是Hastraits的子类。

  

traitlets.observe(* names,** kwargs)

     

一个装饰者,可以用来观察一个类的特征

from traitlets import HasTraits, observe, Instance, Int
​
class A(HasTraits):
    value = Int()
​
    def __init__(self, val):
        self.value = val

    @observe('value')
    def func(self, change):
        print(change)
​
class App(HasTraits):
    myA = Instance(klass=A, args=(2,))
​

app = App()
app.myA.value = 1

{'name': 'value', 'old': 0, 'new': 2, 'owner': <__main__.A object at 0x10b0698d0>, 'type': 'change'}
{'name': 'value', 'old': 2, 'new': 1, 'owner': <__main__.A object at 0x10b0698d0>, 'type': 'change'}

修改

要将更改处理程序保留在组合类中,您可以动态设置观察者。

请注意,观察到的属性必须是特征的属性。 如果您无权将类A修改为子类HasTraits,则可以使用某些类型HasTraits的类。强>魔法。

from traitlets import HasTraits, observe, Instance, Int

class A(HasTraits):
    value = Int()

    def __init__(self, val):
        self.value = val

class App(HasTraits):
    myA = Instance(klass=A, args=(2,))

    def __init__(self):
        super().__init__()
        self.set_notifiers()

    def set_notifiers(self):
        HasTraits.observe(self.myA, func, 'value')


    def func(self, change):
        print(change)

app = App()

app.myA.value = 1