2014-02-21 66 views
2

我正在使用Python 2.5編寫一個動態熱鍵管理器類,並且遇到了麻煩,因爲nameCommands被表示爲字符串梅爾。我結束了看起來像命令:如何在Python中使用字符串創建實例的對象

<bla.Bla instance at 0x0000000028F04388>.thing = 'Dude' 

我見過不少的再版和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 # 

我假設我想要的是某種方式從字符串中獲取該實例的適當對象。 我可以將字符串格式化爲可評估的命令,如果我知道它是什麼樣子的話。 see my cgtalk post for more usage info

SO相關專題:

這一個說,這是不可能的,但用戶也想要一個用例,我希望我提供。 How to obtain an object from a string?

其他: When is the output of repr useful? How to print a class or objects of class using print()? Allowing the repr() of my class's instances to be parsed by eval() Main purpose of __repr__ in python how do you obtain the address of an instance after overriding the __str__ method in python Python repr for classes how to use 'pickle'

回答

1

發現,似乎使用id作爲一個字符串我here工作和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) 
+0

好的發現,謝謝分享。 – Raiyan

2

對於eval工作,內建__repr__功能需要被重寫。我沒有看到你提到那個,所以我認爲你沒有這樣做。我粘貼了一段時間我寫的代碼片段。只是爲了示範。在這個例子中,EVAL工作,因爲__repr__被重寫:

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

這裏更多:http://www.muqube.com/python/string-representation-of-python-objects/

+0

它看起來像這將創建一個新的* *實例,而不是調用的方法*現有*實例 – mhlester

+0

想我只是找到了一個方法實際使用ID甚則代表字符串。 http://stackoverflow.com/a/15702647/1495017 將完全實現,看看我是否遇到任何疑難雜症。 –

+0

@PaulLohman,我只是在測試同樣的事情。它運作得非常漂亮 – mhlester

相關問題