【问题标题】:Dynamic initialization of Traits Range objectTraits Range 对象的动态初始化
【发布时间】:2015-02-09 05:29:54
【问题描述】:

我在尝试动态初始化 Traits Range 对象时遇到问题。

以下代码是我正在尝试做的一个非常简单的示例,但遗憾的是失败并出现以下类型错误:

TypeError: 不支持的操作数类型 -: 'int' 和 'code'

from traits.api import HasTraits, Int, Range
from traitsui.api import View, Item

class DynamicRange(HasTraits):
    """Dynamic initialisation of a Range object"""
    N = Int()
    R = Range(low=0, high='N')

    traits_view = View(Item('R'), Item('N'))

    def __init__(self, N):
        self.N = N         # initial parameter value for N

    def _N_default(self):
        return self.N

Robject = DynamicRange(N=10)
Robject.configure_traits()

如果我将“R”的定义替换为:R = Range(low=0, high=10),则代码有效,但是当然我没有得到动态初始化我正在寻找的 Range 的高参数。

感激地接受所有建议。

* Jonathan 回复后编辑 *

以下是使用 Jonathan 的有用建议对我的问题的简单解决方案:

from traits.api import HasTraits, Range
from traitsui.api import View, Item

class DynamicRange(HasTraits):
    """Dynamic initialisation of a Range object"""
    traits_view = View(Item('R'))

    def __init__(self, N):
        self.add_trait("R", Range(0, N))

Robject = DynamicRange(N=30)
Robject.configure_traits()

【问题讨论】:

    标签: python range enthought traitsui


    【解决方案1】:

    一种方法是不以通常的方式定义特征,而是在__init__ 内定义,因此:

        self.add_trait("R", Range(0, N))
    

    http://docs.enthought.com/traits/traits_user_manual/advanced.html#per-object-trait-attributes

    【讨论】:

      【解决方案2】:

      您遇到了 Traits/TraitsUI 错误:

      解决方法是为低端创建另一个 Trait:

      from traits.api import HasTraits, Int, Range
      from traitsui.api import View, Item
      
      
      class DynamicRange(HasTraits):
          """Dynamic initialisation of a Range object"""
      
          # Upper limit of R
          N = Int()
      
          # Lower limit of R (not exposed to the user)
          _zero = Int(value=0)
      
          R = Range(low='_zero', high='N')
      
          traits_view = View(Item('R'), Item('N'))
      
      
      Robject = DynamicRange(N=10)
      Robject.configure_traits()
      

      或者使用@JonathanMarch 的解决方案。 :)

      【讨论】:

      • 感谢Warren 对本期本质的解释。如果您希望范围是真正动态的(不仅仅是在初始化时),那么这是一个更好的解决方案 - 正如 Warren 的代码示例所示。
      • 是的,感谢 Warren,这确实是一个更好的解决方案,因为它允许在类代码中进行更新。我没有意识到在类代码开头声明的特征对象可以在创建对象时使用传递的参数进行初始化。
      • 啊,但我发现只有在你的类代码中没有 init 函数的情况下才能以这种方式传递参数
      • 我没有包含 __init__() 方法,因为它似乎与问题无关。您可以添加一个__init__() 方法,但请确保它包含对父类的__init__() 方法的调用。也就是说,如果您在 DynamicRange 类中有 def __init__(self, **kw):,则在方法中包含 super(DynamicRange, self).__init__(**kw) 行。
      • @dreme -- Warren 在这里的评论值得研究,以更深入地了解如何使用类继承。
      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2011-08-22
      • 2013-06-27
      • 1970-01-01
      相关资源
      最近更新 更多