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

Aru*_*ran 3 traits ipython python-3.x

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

例子:

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

class myApp(HasTraits):
    myA = Instance(A,kw={'val':2})
Run Code Online (Sandbox Code Playgroud)

如果对象 myA 的“value”成员变量发生更改,我希望调用一个观察方法。如下所示:

@observe('myA.value')
def onValueChange(self,change):
    return
Run Code Online (Sandbox Code Playgroud)

Trailets 的实施是否可行?

Olu*_*ule 6

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

\n
\n

Traitlets.observe(*names, **kwargs)

\n

可用于观察类上的 Traits 的装饰器。

\n
\n
from traitlets import HasTraits, observe, Instance, Int\n\xe2\x80\x8b\nclass A(HasTraits):\n    value = Int()\n\xe2\x80\x8b\n    def __init__(self, val):\n        self.value = val\n    \n    @observe('value')\n    def func(self, change):\n        print(change)\n\xe2\x80\x8b\nclass App(HasTraits):\n    myA = Instance(klass=A, args=(2,))\n\xe2\x80\x8b\n\napp = App()\napp.myA.value = 1\n\n{'name': 'value', 'old': 0, 'new': 2, 'owner': <__main__.A object at 0x10b0698d0>, 'type': 'change'}\n{'name': 'value', 'old': 2, 'new': 1, 'owner': <__main__.A object at 0x10b0698d0>, 'type': 'change'}\n
Run Code Online (Sandbox Code Playgroud)\n

编辑

\n

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

\n

请注意,观察到的属性必须是特征的属性。\n如果您无权将 class 修改A为 subclass HasTraits,您可以HasTraits使用某种类型魔法来编写一个动态子类化的类。

\n
from traitlets import HasTraits, observe, Instance, Int\n\nclass A(HasTraits):\n    value = Int()\n\n    def __init__(self, val):\n        self.value = val\n\nclass App(HasTraits):\n    myA = Instance(klass=A, args=(2,))\n    \n    def __init__(self):\n        super().__init__()\n        self.set_notifiers()\n        \n    def set_notifiers(self):\n        HasTraits.observe(self.myA, func, 'value')\n        \n    \n    def func(self, change):\n        print(change)\n        \napp = App()\n\napp.myA.value = 1\n
Run Code Online (Sandbox Code Playgroud)\n