实例化Enthought特征的默认实例

时间:2015-09-04 15:09:51

标签: python enthought traits

考虑这个简单的最小例子:

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

2 个答案:

答案 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

这打印"迷上"如预期的那样。