【问题标题】:python: creating instance from variable namepython:从变量名创建实例
【发布时间】:2011-06-16 04:37:48
【问题描述】:

***EDIT2: 抱歉代码有问题。这是说明相同问题的工作代码:

class bead():
    def printmsg(a):
        print('test message')

chain1=bead()
x='chain1'
eval(x + '.printmsg()')

***编辑:感谢您回答原始问题。这是我的问题的措辞更好的版本:

class bead():
    def msg():
        print('test message')

x='chain1'
y='bead1'

eval(x + '.' + y + '=bead()')

chain1.bead1.msg()

输出: '测试消息'

有什么更好的方法来做到这一点?

原问题:

脚本:

class testClass():
    test1='test1 text'

x='testClass'
y='test1'

eval(x + '.' + y)

输出: 'test1 文本'

有更好的方法吗?

***编辑:getattr() 用于从类中提取信息。谢谢大佬。让我稍微改变一下问题:

我可以用什么来代替:

x='chain1' y='mol1'

【问题讨论】:

  • 做什么?它真的没有任何用处。
  • 我不明白 - 你的标题是“从变量名创建实例”,但看起来你正在尝试访问 testClass.test1。这不是testClass 类的实例,您没有创建它。
  • 我不明白编辑过的问题。 eval(x + '.' + y + '=bead()') 不起作用。你不能在那里做任务。您是在寻求一种动态创建变量的方法,还是在询问有关该类的问题?
  • 是的。我正在尝试从字符串的变量动态创建一个类的实例。
  • @jHoro,你最好剪切和粘贴而不是输入你的问题。你的例子永远不会像输入的那样工作。

标签: python class instance


【解决方案1】:

你可以说,而不是eval()

getattr(locals()[x], y)

或

getattr(locals().get(x), y)

你是这个意思吗?

【讨论】:

  • 感谢您的回答。但是我没有很好地表达这个问题。请注意修改。
【解决方案2】:

我想我明白了。你可能想要的是:

>>> class testClass():
...     test1='test1 text'
... 
>>> getattr(testClass, 'test1')
'test1 text'


仍然没有创建实例。根据 gnibbler 的回答,在这里你举一个例子:
>>> locals().get(x)()
<__main__.testClass instance at 0xb73b056c>
>>> getattr(locals().get(x)(), y)
'test1 text'

对于您的最新编辑:

>>> class bead():
...     def printmsg(a):
...         print('test message')
... 
>>> chain1=bead()
>>> x='chain1'
>>> eval(x + '.printmsg()')
test message
>>> getattr(locals()[x], 'printmsg')()
test message

【讨论】:

  • 但那是:“testClass”不是testClass
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多