2013-08-22 66 views
5

我可以通過組合字符串來調用一個方法來處理數據嗎?如何通過Python中的字符串調用方法?

例如,它是確定在代碼中輸入「data.image.truecolor()」,

data.image.truecolor() # This line is successful to call method 

我的問題是:如果我有一個數據對象命名的數據(不是字符串),如何結合「.image.truecolor」刺激來調用方法來處理數據?

它是這樣的:

result=getattr(data,".image.truecolor") 
result() # which is equivalent to the code above 

當然,這是失敗的。我有一個AttributeError。

因爲有許多方法來處理數據,例如:

data.image.fog() 
data.image.ir108() 
data.image.dnb() 
data.image.overview() 
# .... and other many methods 

它是愚蠢和難看手工鍵入代碼,是嗎?

通過這個原因,我希望我可以使用此代碼:

methods=["fog","ir108","dnb","overview"] 
for method in methods: 
    method=".image"+method 
    result=getattr(data,method) # to call method to process the data 
    result() # to get the data processed 

是否有可能通過這種方式呢?

感謝您的任何幫助。

回答

9
methods=["fog","ir108","dnb","overview"] 
dataImage = data.image 
for method in methods: 
    result = getattr(dataImage ,method) # to call method to process the data 
    result() # to get the data processed 

爲什麼不這樣做,當你知道你會調用data.image的方法?否則,如果您不知道第二個屬性image,您將不得不使用其他答案中建議的兩個級別getattr

+0

謝謝,但這種方式並不成功。由於最終的數據由許多不同的類(包括不同的模塊)處理,我仍然通過dataImage = data.image得到一個AttributeError。但是,我知道如何通過你的幫助來做到這一點。謝謝。 – Makoto

+0

對不起.......現在它成功了!因爲我使用「data = data.image」,通過Python的gabarge集合來節省內存空間(我的計算機有16GB,它仍然不夠),它是錯誤的,所以我猜它也未能分配給不同的變量。但是,我嘗試dataImage = data.image,它是成功的!謝謝! – Makoto

4

你需要一個二級getattr

im = getattr(data, 'image') 
result=getattr(im, method) 
result() 
+0

如果第二個參數是常量,第一個'getattr'有什麼意義? 'meth = getattr(data.image,method)'會更具可讀性。 – user4815162342

+0

從OP問題來看,並不清楚(至少對我來說)'圖像'部分是否總是不變。 – hivert

+0

他們的代碼示例使得它看起來很穩定,只是OP期望像getattr(data,「image。%s」%method)'工作(省略'.'來啓動)。 – user4815162342

3

可以使用getattr用於獲取通過名稱類實例的方法,這裏有一個例子:

class A(): 
    def print_test(self): 
     print "test" 

a = A() 
getattr(a, 'print_test')() # prints 'test' 

而且,你的情況,將會有兩個getattr s,一個用於圖像,另一個用於圖像方法:

methods=["fog","ir108","dnb","overview"] 
image = getattr(data, 'image') 
for method in methods: 
    result = getattr(image, method) 
    result() 
0

您也可以使用eval("data.image.fog()")來調用/計算字符串中的表達式。

相關問題