考虑这个简单的最小示例:
from traits.api import Instance, Str, HasTraits
class Person(HasTraits):
name = Str("hooked")
class Chair(HasTraits):
sitting = Instance(Person)
t = Chair()
print t.sitting.name
这会失败,因为 t.sitting 的计算结果为 None。 Enthought's traits module将强制 t.sitting 的类型是 Person 但我怎样才能让默认人在这里实例化?我不想将任何参数传递给 Chair(**kwargs) 我希望它自动完成。 print 语句的预期输出是 hooked。
请您参考如下方法:
您已经明确定义了 Chair,因此它的默认实例不会实例化其属性 sitting,这就是正在发生的事情。如果您希望默认实例化 sitting,那么您可以。
所以选择吧。如果您想保留 Chair 的原始定义,但这次确保将 sitting 实例化为其默认值,则:
from traits.api import Instance, Str, HasTraits
class Person(HasTraits):
name = Str("hooked")
class Chair(HasTraits):
sitting = Instance(Person)
t = Chair(sitting=Person())
print t.sitting.name
但是,如果您希望始终使用默认的 sitting 实例化默认的 Chair,那么(编辑:并显示 traitsui 的实际效果):
from traits.api import Instance, Str, HasTraits
from traitsui.api import Item, View
class Person(HasTraits):
name = Str("hooked")
class Chair(HasTraits):
sitting = Instance(Person,())
view = View((Item( 'sitting', style = 'custom')))
t = Chair()
print t.sitting.name
t.configure_traits()
# or overridden by:
w = Chair(sitting=Person(name='snooked'))
print w.sitting.name
