Python:从变量名创建实例

2 投票
2 回答
1205 浏览
提问于 2025-04-16 19:40

***编辑2:抱歉,之前的代码有问题。这里有一段能正常运行的代码,展示了同样的问题:

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

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

***编辑:感谢gnibbler回答了我最初的问题。这里是我问题的更清晰版本:

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)

输出:

'测试1文本'

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

***编辑:getattr()可以用来从类中提取信息。谢谢gnibbler。不过让我稍微改一下问题:

我可以用什么代替:

x='链1'

y='分子1'

2 个回答

1

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

>>> 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
12

与其使用 eval(),你可以这样说:

getattr(locals()[x], y)

或者

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

这就是你的意思吗?

撰写回答