实例化 Enthought 特征的默认实例

Instantiating a default instance for an Enthought trait

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

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 的计算结果为 NoneEnthought's traits module 将强制 t.sitting 的类型是 Person 但我怎样才能让默认人在这里实例化?我不想将任何参数传递给 Chair(**kwargs) 我希望它自动完成。打印语句的预期输出是 hooked.

这很有趣。根据 Instance 文档字符串,如果 klass 是 class 且未指定 arg 和 kw,则调用 Instance 将 return None。 arg 和 kw 的默认值为 None,因此调用 Instance(Person) 就像您看到的那样 returning 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

这会按预期打印 "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 实例化默认椅子,那么(编辑:并显示 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