从类构造函数[Python/Traits]中更改属性参数

Pte*_*ium 6 python constructor traits

我是python的新手 - 对不起,如果我的术语错了.我有一个继承了Enthought Traits属性的类.这是一个简化版本:

from enthought.traits.api import HasTraits, Range
from enthought.traits.ui.api import View, Item

class GUIThing(HasTraits):

    my_slider = Range(0.0, 0.6, 0.1)
    my_slider._high = 0.7   # works; not what I need 'coz not instance-dependent

    view = View( Item('my_slider') )

    def __init__(self, arg1):
        # Call the parent's __init__
        HasTraits.__init__(self)

        self.my_slider._high = arg1  # what I need; doesn't work

# -- Main program -----

top_range = 0.9

my_gui = GUIThing(top_range)
my_gui.configure_traits()
Run Code Online (Sandbox Code Playgroud)

这只是创建一个带滑块的窗口,最初从0.0到0.6,初始值为0.1.创建GUIThing实例时,我想根据当前top_range值改变滑块的最大值.但行

self.my_slider._high = arg1

结果是

AttributeError: 'float' object has no attribute '_high'

在其中时__init__(),self.my_slider不返回滑块对象,而是返回滑块的当前值.

我究竟做错了什么?谢谢!

编辑:

以下也不起作用:

class GUIThing(HasTraits):

    def __init__(self, arg1):
        # Call the parent's __init__
        HasTraits.__init__(self)

        self.my_slider = Range(0.0, arg1, 0.0)

    view = View( Item('my_slider') )
Run Code Online (Sandbox Code Playgroud)

这将是我正在尝试做的直接方式,但它导致GUI而不是滑块,有一个文本框,在0xa61946c处读取"enthought.traits.trait_types.Range对象".所以问题是当my_slider__init__()"my_slider"中创建时,意味着对象本身(通过View无法正确显示); 但如果my_slider在外部创建,__init__()则"my_slider"将表示当前值(浮点数;这会阻止访问对象属性).

不确定这是Traits特有的还是我不知道如何正确初始化对象.

fab*_*ioM 0

我的直觉是,您不需要修改该类,而是扩展 Range 类并添加处理特定情况所需的额外逻辑。