考虑下面这个简单的最小示例:
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。恩尼特特征模将强制执行t.sitting的类型是Person,但是如何在这里实例化默认的人员?我不想将任何参数传递给Chair(**kwargs),我希望这是自动完成的。对print语句的预期输出是hooked。
发布于 2015-09-04 17:10:00
这很有趣。根据实例docstring,如果klass是一个类并且没有指定arg和kw,调用实例将不返回。arg和kw的默认值为None,因此调用实例(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这印“钩”如预期。
发布于 2015-09-05 02:04:54
您已经显式地定义了Chair,这样它的默认实例就不会实例化它的属性sitting,这就是正在发生的事情。如果您希望默认情况下实例化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.namehttps://stackoverflow.com/questions/32401318
复制相似问题