考虑这个简单的最小例子:
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
。
答案 0 :(得分:3)
您已明确定义Chair
,以便其默认实例不会实例化其属性sitting
,而这正是发生的事情。如果你宁愿在默认情况下实例化sitting
,那么你可以。
所以请你选择。如果您想保留Chair的原始定义,但这次确保将sit实例化为其默认值,则:
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
实例化默认主席,那么(编辑:并显示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
答案 1 :(得分:2)
这很有趣。根据Instance docstring,如果klass是一个类并且未指定arg和kw,则调用Instance将返回None。 arg和kw的默认值为None,因此调用Instance(Person)会返回None,就像你看到的一样。 我通过添加" kw = {}"来获得您的代码。或" args = []"到实例调用。
from traits.api import Instance, Str, HasTraits
class Person(HasTraits):
name = Str("hooked")
class Chair(HasTraits):
sitting = Instance(Person, kw = {})
t = Chair()
print t.sitting.name
这打印"迷上"如预期的那样。