如何在Python中从字符串创建实例的对象

如何在Python中从字符串创建实例的对象,python,eval,maya,repr,Python,Eval,Maya,Repr,我使用Python 2.5在Maya中工作,编写了一个动态热键管理器类,但在尝试分配特定于实例的命令时遇到了问题,因为nameCommands在mel中表示为字符串。我最终得到的命令如下所示: <bla.Bla instance at 0x0000000028F04388>.thing = 'Dude' .thing='Dude' 关于repr和eval的话题,我已经看到了很多,但是我下面的测试示例失败了 class Foo: pass f = Foo() f.thin

我使用Python 2.5在Maya中工作,编写了一个动态热键管理器类,但在尝试分配特定于实例的命令时遇到了问题,因为nameCommands在mel中表示为字符串。我最终得到的命令如下所示:

<bla.Bla instance at 0x0000000028F04388>.thing = 'Dude'
.thing='Dude'
关于repr和eval的话题,我已经看到了很多,但是我下面的测试示例失败了

class Foo:
    pass

f = Foo()
f.thing = 'Jeff'
rep = repr(f)
y = eval(rep) # errors here
name = y.thing

# Error: invalid syntax
# Traceback (most recent call last):
#   File "<maya console>", line 7, in <module>
#   File "<string>", line 1
#     <__main__.Foo instance at 0x00000000294D8188>
#     ^
# SyntaxError: invalid syntax # 
Foo类:
通过
f=Foo()
f、 东西=‘杰夫’
rep=repr(f)
y=eval(rep)#此处的错误
name=y.thing
#错误:无效语法
#回溯(最近一次呼叫最后一次):
#文件“”,第7行,在
#文件“”,第1行
#     
#     ^
#语法错误:无效语法#
我假设我想要的是某种从字符串中获取该实例的适当对象的方法。 如果我知道字符串是什么样子,我可以将其格式化为可求值的命令。

因此,相关主题:

这篇文章说这是不可能的,但用户也想要一个用例,我希望我已经提供了。

其他:
要使
eval
正常工作,需要覆盖内置的
\uuuu repr\uuu
功能。我没看到你提到那件事,所以我想你没有这么做。我正在粘贴一段我不久前写的代码片段。只是为了示范。在本例中,eval之所以有效,是因为
\uuu repr\uu
被覆盖:

class element :
    def __init__(self, a, m):
        self.name = a ;
        self.atomic_mass = m ;

    def __str__(self):
        return "{0} has atomic mass {1}".format(self.name, self.atomic_mass)

    def __repr__(self):
        return "element(\"{0}\", \"{1}\")".format(self.name, self.atomic_mass)

H = element("Hydrogen", 1.00794)
print H
print repr(H)
print eval(repr(H))

更多信息:

找到了一个似乎适合我的方法,使用id作为字符串和ctypes

class Foo:
    pass

f = Foo()
f.thing = 'Jeff'

import ctypes    
long_f = id(f)
y = ctypes.cast(long_f,ctypes.py_object).value
name = y.thing
这里是Maya中的一个示例用法

command = ("python(\"ctypes.cast(%s,ctypes.py_object).value.thing=False\")")%(id(self))
nameCommand = cmds.nameCommand( 'setThingOnPress', annotation='', command=command )
cmds.hotkey( keyShortcut='b', name=nameCommand)

这看起来像是创建了一个新实例,而不是调用现有实例的方法。我刚刚找到了一种实际使用id而不是rep字符串的方法。将全面实施,以查看是否遇到任何gotcha问题。@PaulLohman,我只是在测试相同的东西。它工作得很漂亮,所以使用它;command=((“python(\”ctypes.cast(%s,ctypes.py\u object).value.thing=False\”))%(id(self))nameCommand=cmds.nameCommand('setThingOnPress',annotation='',command=command)@PaulLohman,您应该将其作为新答案发布,并接受它。这样,未来的游客可以看到并从中学习。一定要包括一个链接,指向你找到的另一个有价值的答案