¿Cómo llamar al método por cadena?

¿Puedo llamar a un método para procesar datos combinando cadenas?

Por ejemplo, ¿está bien escribir data.image.truecolor() en el código?

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

Mi problema es: si tengo un objeto de datos llamado data (no una cadena), ¿cómo combinar el ".image.truecolor" para llamar al método para procesar los datos?

Es como:

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

Por supuesto, se ha fallado. Tengo un AttributeError .

Porque hay muchos métodos para procesar datos, por ejemplo:

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

Es estúpido y feo escribir el código a mano, ¿no es así?

Por este motivo, espero poder usar este código:

 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 

¿Es posible hacerlo por este camino?

 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 

¿Por qué no de esta manera cuando sabes que data.image métodos de data.image ? De lo contrario, si no conociera la segunda propiedad, image , habría tenido que usar dos niveles de getattr como se sugiere en las otras respuestas.

Necesitas un getattr dos niveles:

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

Puede usar getattr para obtener métodos de instancia de clase por nombre, aquí hay un ejemplo:

 class A(): def print_test(self): print "test" a = A() getattr(a, 'print_test')() # prints 'test' 

Y, en su caso, habrá dos getattr s, uno para imagen y otro para el método de imagen:

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

También puede usar eval("data.image.fog()") para llamar / evaluar una expresión en una cadena.