2011-08-20 19 views
8

¿Cómo se puede ejecutar un método dando su nombre, desde otro método que está en la misma clase que el método llamado? De esta manera:python variable method name

class Class1: 
    def __init__(self): 
     pass 
    def func1(self, arg1): 
     # some code 
    def func2(self): 
     function = getattr(sys.modules[__name__], "func1") # apparently this does not work 

¿Alguna sugerencia?

Respuesta

9

¿qué tal getattr(self, "func1")? Además, evite el uso de la función nombre

Por ejemplo:

>>> class C: 
... def f1(self, arg1): print arg1 
... def f2(self): return getattr(self, "f1") 
... 
>>> x=C() 
>>> x.f2()(1) 
1 
+0

No hay ninguna razón para usar 'getattr' si conoce el método que desea, solo agárrelo. –

5

que debe obtener el atributo de la clase, no el módulo.

def func2(self): 
    method = getattr(self, "func1") 
    method("arg") 

Pero también debe comprobar que se puede llamar.

if callable(method): 
    method("arg") 

Esto evitará llamar a algo que no esperaba obtener. Es posible que desee plantear su propia excepción aquí si no es invocable.

+0

gracias, está trabajando – Shaokan

+0

'getattr' no es necesario cuando se conoce el nombre del método. Además, ¿por qué verificar si se puede llamar? O lo es (y debería ser si se trata de un método) o generará una excepción, que es la forma correcta de manejar un error. –

+2

@Ethan presumiblemente el nombre sería en realidad una variable, y esto es solo un ejemplo. La verificación invocable evita errores, en una línea de código, y la intención es más clara, ya que getattr puede devolver cualquier tipo de atributo y no solo métodos. – Keith