Python 2.7 如何将特征组合在一起,将它们封装为一个组

Python 2.7 如何将特征组合在一起,将它们封装为一个组,python-2.7,enthought,traits,mayavi,Python 2.7,Enthought,Traits,Mayavi,我有一个坐标系,将其视为一个“整体”是有意义的。它们同时初始化、更改和重置。我也不喜欢在坐标发生变化时重新渲染多次。这是我的想法的简化版本,但我不能完全达到目的。谢谢 在我的例子中,更干净的代码更好,即使它使用了更高级的特性。类“Coord”本身是否可以包装为特征 from traits.api import * class Coord(HasTraits): x=Float(1.0) y=Float(1.0) def __init__(self,**traits):

我有一个坐标系,将其视为一个“整体”是有意义的。它们同时初始化、更改和重置。我也不喜欢在坐标发生变化时重新渲染多次。这是我的想法的简化版本,但我不能完全达到目的。谢谢

在我的例子中,更干净的代码更好,即使它使用了更高级的特性。类“Coord”本身是否可以包装为特征

from traits.api import *

class Coord(HasTraits):
    x=Float(1.0)
    y=Float(1.0)
    def __init__(self,**traits):
        HasTraits.__init__(self,**traits)

class Model:
    coord=Instance(Coord)
    @on_trait_change('coord')##I would so have liked this to "just work"
    def render(self):#reupdate render whenever coordinates change

class Visualization:
    model=Instance(Model)

    def increment_x(self):
        self.model.coord.x+=1 ##should play well with Model.render
    def new_coord(self):
        self.model.coord=Coord(x=2,y=2) ##should play well with Model.render

您的源代码有几个问题<代码>模型和
可视化
都需要是
HasTraits
类,侦听器才能工作


此外,实际上很少需要编写
HasTraits
类的
\uuuu init\uuuu
方法。Traits被设计成在没有它的情况下工作。也就是说,如果您确实编写了
\uuuu init\uuu
方法,请确保使用
super
正确遍历方法解析顺序。(请注意,您会发现现有文档和示例中的实现不一致。)

最后,使用
'anytrait'
名称来侦听任何特征:

from traits.api import Float, HasTraits, Instance, on_trait_change

class Coord(HasTraits):
    x=Float(1.0)
    y=Float(1.0)

class Model(HasTraits):
    coord=Instance(Coord, ())
    @on_trait_change('coord.anytrait')  # listens for any trait on `coord`.
    def render(self):
        print "I updated"

class Visualization(HasTraits):
    model=Instance(Model, ())

    def increment_x(self):
        self.model.coord.x+=1  # plays well with Model.render
    def new_coord(self):
        self.model.coord=Coord(x=2,y=2)  # plays well with Model.render
以下是我的输出:

>>> v = Visualization()
>>> v.increment_x()
I updated
>>> v.new_coord()
I updated

谢谢你的反馈。为了更全面地回答这个问题,您应该演示“v.new_coord()”。关键是v.new_coord应该只触发model.render()一次。我(我觉得很难看)目前的解决办法是单独设置每个坐标,然后另一个变量flush\u coordinal\u改变,我将其设置为True。我只听平面坐标的变化。第二点。我在文档中看到子类一直在调用HasTraits init方法。这是我发现的第一个例子。诚然,来自mayavi代码,不是严格意义上的特征。不能编辑以前的帖子。我想已经太久了。(谷歌搜索)[“:”别忘了调用家长的init"带引号的with initTraits设计为在没有显式的
\uuuu init\uuuu
方法的情况下工作,尽管有时是必要的,尤其是当您需要动态默认方法和静态侦听器时。但是,通常情况下,它不是必需的。@user3391229我已经更新了代码输出和我的解释,以澄清一些问题。我的Common关于
\uuuu init\uuuu
一开始有点不对劲。