2013-08-22 14 views
5

Czy mogę wywołać metodę przetwarzania danych przez łączenie łańcuchów?Jak wywołać metodę według napisu w Pythonie?

Na przykład, to jest ok, aby wpisać "data.image.truecolor()" w kodzie,

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

Mój problem jest: Jeśli mam obiekt danych nazwanych danych (nie łańcuch), jak połączyć metodę ".image.truecolor" żądań, aby wywołać metodę przetwarzania danych?

Jest jak:

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

oczywiście, nie powiodła się. Dostałem AttributeError.

Ponieważ istnieje wiele metod do przetwarzania danych, na przykład:

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

Jest głupi i brzydki, aby wpisać kod ręcznie, nie jest to?

By tego powodu, mam nadzieję, mogę użyć tego kodu:

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 

Czy można zrobić w ten sposób?

Dzięki za pomoc.

Odpowiedz

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 

Dlaczego nie tak, gdy wiesz, że będziesz wywoływać metody data.image? W przeciwnym razie, gdybyś nie znał drugiej właściwości, image, musiałbyś użyć dwóch poziomów getattr, jak sugerowano w innych odpowiedziach.

+0

Dziękuję, ale ten sposób nie powiedzie się. Ponieważ ostateczne dane są przetwarzane przez wiele różnych klas (obejmują różne moduły), nadal otrzymuję AttributeError od dataImage = data.image. Jednak wiem, jak to zrobić z twojej pomocy. Dzięki. – Makoto

+0

Przykro mi ....... Teraz to się udaje! ponieważ używam "data = data.image", aby zaoszczędzić miejsce w pamięci przez kolekcję Gabarge Pythona (mam 16 GB na moim komputerze, to wciąż za mało), to jest falied, więc myślę, że nie udało się również przypisać do innej zmiennej . Jednak próbuję dataImage = data.image, to się udaje! Dziękuję Ci! – Makoto

4

Potrzebny jest dwupoziomowa getattr:

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

Jaki jest sens pierwszego 'getattr', jeśli jego drugi argument jest stały? 'meth = getattr (data.image, method)' byłoby bardziej czytelne. – user4815162342

+0

Nie było jasne (przynajmniej dla mnie) z pytania OP, czy część "obrazu" była zawsze stała. – hivert

+0

Ich przykładowy kod sprawiał wrażenie dość stałego, po prostu OP oczekiwał czegoś takiego jak 'getattr (data," image.% S "% method)' do pracy (pomijając '.' do startu). – user4815162342

3

Można użyć getattr uzyskania metody instancji klasy według nazwy, oto przykład:

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

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

A w twoim przypadku, nie będzie dwa getattr s, jeden dla obrazu i jeden dla obrazu:

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

Można również użyć eval("data.image.fog()") do wywołania/oceny wyrażenia w ciągu znaków.

Powiązane problemy