首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例化Enthought特性的默认实例

实例化Enthought特性的默认实例
EN

Stack Overflow用户
提问于 2015-09-04 15:09:51
回答 2查看 205关注 0票数 1

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-04 17:10:00

这很有趣。根据实例docstring,如果klass是一个类并且没有指定arg和kw,调用实例将不返回。arg和kw的默认值为None,因此调用实例(Person)将像您看到的那样返回None。我通过在实例调用中添加"kw = {}“或"args = []”来使您的代码工作。

代码语言:javascript
复制
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

这印“钩”如预期。

票数 2
EN

Stack Overflow用户

发布于 2015-09-05 02:04:54

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

所以你自己挑吧。如果您希望保留原来对椅子的定义,但这一次确保将会议实例化为默认的,那么:

代码语言:javascript
复制
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在运行中):

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32401318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档