如何在Python中从字符串创建实例的对象
我使用Python 2.5在Maya中工作,编写了一个动态热键管理器类,但在尝试分配特定于实例的命令时遇到了问题,因为nameCommands在mel中表示为字符串。我最终得到的命令如下所示:如何在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
<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,您应该将其作为新答案发布,并接受它。这样,未来的游客可以看到并从中学习。一定要包括一个链接,指向你找到的另一个有价值的答案