2015-09-04 90 views
1

考虑这个简单的小例子:实例化一个默认实例的Enthought性状

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

回答

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 

这会按预期打印“挂钩”。

+0

谢谢你的答案,这似乎解决了我的问题。我编辑了你的文章,我想你搞砸了一些代码格式。欢迎来到StackOverflow! – Hooked

3

您已明确定义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.name 
+0

Ohhhh!我没有意识到'Person'也定义了一个特质(尽管我猜现在很明显)。我认为所有非基本类型都必须包装在一个'Instance'中。我想我不明白“Instance”的用途。我很高兴看到这里有一个强大的Enthought社区,你们都很有帮助! – Hooked

+0

“实例”的目的:(a)通常想要键入这样一个属性,而不需要类就知道它的值的实际标识。 (b)另外,如果你想使用traitsui来显示/编辑对象,我想你需要明确指定实例。因此,我正在修改我的第二个案例以显示此操作(生成的实例代码现在更接近jcorson的实例) –