Python 实例化一个EnThound特征的默认实例

Python 实例化一个EnThound特征的默认实例,python,enthought,traits,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.siting的计算结果为None。将强制执行t.siting的类型为Pers

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

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.siting
的计算结果为
None
。将强制执行
t.siting
的类型为
Person
,但如何才能在此处获得要实例化的默认Person?我不想将任何参数传递给
椅子(**kwargs)
我希望这是自动完成的。print语句的预期输出是hooked,这很有趣。根据实例docstring,如果klass是一个类,并且未指定arg和kw,则调用实例将返回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

这将按预期打印“钩状”。

这很有趣。根据实例docstring,如果klass是一个类,并且未指定arg和kw,则调用实例将返回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

这将按预期打印“hooked”。

您已经明确定义了
椅子
,因此其默认实例不会实例化其属性
siting
,这就是正在发生的情况。如果您希望在默认情况下实例化
siting
,那么您可以

所以你挑吧。如果您希望保留椅子的原始定义,但这一次确保坐姿被实例化为其默认值,那么:

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
但是,如果您希望默认椅子总是用默认的
坐姿
实例化,那么(编辑:并显示traitsui的动作):


您已经明确定义了
Chair
,这样它的默认实例就不会实例化它的属性
siting
,这就是正在发生的事情。如果您希望在默认情况下实例化
siting
,那么您可以

所以你挑吧。如果您希望保留椅子的原始定义,但这一次确保坐姿被实例化为其默认值,那么:

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
但是,如果您希望默认椅子总是用默认的
坐姿
实例化,那么(编辑:并显示traitsui的动作):


谢谢你的回答,这似乎解决了我这边的问题。我编辑了你的文章,我想你把一些代码格式弄乱了。欢迎来到StackOverflow!谢谢你的回答,这似乎解决了我这边的问题。我编辑了你的文章,我想你把一些代码格式弄乱了。欢迎来到StackOverflow!哦!我没有意识到,
Person
也定义了一种特质(尽管我想现在很明显)。我认为所有非基类型都必须包装在一个
实例中。我想我不明白
实例的目的。我很高兴看到这里有一个充满热情的社区,所以,你们一直在帮助我!“实例的目的:”(a)通常希望在类不知道其值的实际标识的情况下键入此类属性。(b) 另外,如果要使用traitsui显示/编辑对象,我认为需要显式指定实例。因此,我正在修改我的第二个案例,以便在实际操作中展示这一点(生成的实例代码现在更接近jcorson的代码)哦!我没有意识到,
Person
也定义了一种特质(尽管我想现在很明显)。我认为所有非基类型都必须包装在一个
实例中。我想我不明白
实例的目的。我很高兴看到这里有一个充满热情的社区,所以,你们一直在帮助我!“实例的目的:”(a)通常希望在类不知道其值的实际标识的情况下键入此类属性。(b) 另外,如果要使用traitsui显示/编辑对象,我认为需要显式指定实例。因此,我正在修改我的第二个案例,以在实践中展示这一点(生成的实例代码现在更接近jcorson的)