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

How to observe Instance member variables using traitlets library?

我正在尝试在我的代码中使用 ipython 提供的 traitlets 库。假设如果特征是特定 class 的实例,我如何观察 class..

成员的值变化

示例:

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

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

如果对象 myA 的 'value' 成员变量发生变化,我想调用一个观察方法。如下所示:

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

trailets 的实现是否可行?

为了观察实例特征值的变化,实例特征的class应该subclass Hastraits.

traitlets.observe(*names, **kwargs)

A decorator which can be used to observe Traits on a class.

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'}

编辑

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

请注意,观察到的属性必须是 属性 的特征。 如果您无权将 class A 修改为 subclass HasTraits,您可以编写一个 class subclasses HasTraits 即时使用一些 type 魔法。

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