有人能解释为什么这段代码会崩溃吗?我认为应该发生的是,如果它使用完全限定的特征名称,它就不会崩溃,在这种情况下就是这样。
from traits.api import *
from traitsui.api import *
class Struct(HasTraits): pass
class Struct1(Struct):
some_data=Int(4)
some_more_data=Str('pizza')
class Struct2(Struct):
some_data=Int(5)
some_more_data=Str('wossar')
class Subwindow(Handler):
struct1=Instance(Struct1)
struct2=Instance(Struct2)
which_struct=Enum(1,2)
cur_struct=Any
def _struct1_default(self): return Struct1()
def _struct2_default(self): return Struct2()
def _cur_struct(self): return self.struct1
@on_trait_change('which_struct')
def switch_views(self): NotImplemented #switch views here
traits_view=View(
Item(name='which_struct'),
Item(name='object.cur_struct.some_data'),
Item(name='object.cur_struct.some_more_data'),
)
Subwindow().configure_traits()
当我运行时,我得到了
AttributeError: 'Subwindow' object has no attribute 'object.cur_struct.some_data'
但是如果你检查对象的确如此。
我正在摆弄这个例子,如果我用cur_struct
特征替换Property
,我就能正常工作,我不知道为什么。但是,对于我的实际应用程序来说,这是不可行的,其中另一个类从一个完全不同的类中侦听事件并切换cur_struct
。
答案 0 :(得分:2)
啊,不要使用Item(name=...)
。只需将名称作为第一个位置参数传递即可。在将赋值传递给name
特征之前,构造函数对传递给它的值执行一些特殊处理。显式使用name
仅在我们需要避免处理时在内部使用。