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 的实施是否可行?
为了观察实例特征值的变化,实例特征的类应该子类化Hastraits。
\n\nTraitlets.observe(*names, **kwargs)
\n可用于观察类上的 Traits 的装饰器。
\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'}\nRun Code Online (Sandbox Code Playgroud)\n编辑
\n为了将更改处理程序保留在组合类中,您可以动态设置观察者。
\n请注意,观察到的属性必须是特征的属性。\n如果您无权将 class 修改A为 subclass HasTraits,您可以HasTraits使用某种类型魔法来编写一个动态子类化的类。
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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |