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



我有一个坐标系统,它是有意义的作为一个"整体组"。它们同时初始化、更改和重置。我也不喜欢重新渲染那么多次,因为我有坐标时,一个变化。这是我脑海中的简化版本,但我不能完全做到这一点。谢谢。

在我的情况下,更简洁的代码更好,即使它使用了更高级的功能。类"Coord"可以包装为trait本身吗?
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

您的源代码有几个问题。ModelVisualization都需要为HasTraits类才能使监听器工作

同样,实际上很少需要编写HasTraits类的__init__方法。没有它,Traits也能工作。也就是说,如果您确实要编写__init__方法,请确保使用super来正确遍历方法解析顺序。(注意,在现有的文档和示例中,您会发现这与实现不一致。)

最后,使用'anytrait'名称侦听任何trait:

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

相关内容

  • 没有找到相关文章

最新更新