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

时间:2015-08-21 01:07:06

标签: python-2.7 enthought traits mayavi

我有一个坐标系统,它可以作为一个整个组来对待#34;。它们同时初始化,更改和重置。当一个人改变时,我也喜欢不像我有坐标那样多次重新渲染。这是我想到的简化版本,但我无法实现。感谢。

清洁代码在我的情况下更好,即使它使用更高级的功能。班级' 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

1 个答案:

答案 0 :(得分:1)

您的源代码存在一些问题。 ModelVisualization都需要HasTraits个类才能让听众发挥作用。

此外,实际上很少需要编写__init__类的HasTraits方法。特征是为没有它而设计的。也就是说,如果您执行编写__init__方法,请务必使用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