Hola a todos, soy nuevo en Python y tengo la siguiente clase:

class A:
  def __init__(self):
    #some definitions

  def executeAFunction(self, name)
    self.__dict__[name]
  
  def doSomething():
    #some code

Lo que quiero lograr es poder usar la función "doSomething" llamando a executeAfunction ('doSomething')

Con el código anterior tengo un error de clave en uno mismo. dict [nombre] para el valor 'hacer algo'

¿Qué estoy haciendo mal?

1
Emmanuel Madarassou 7 ago. 2020 a las 17:13

2 respuestas

La mejor respuesta

Creo que para algo como esto, sería mejor usar getattr. Se necesita una cuerda exactamente como se describe.

Podrías reescribir executeAFunction como

def executeAFunction(self, name):
    return getattr(self, name)()

Si quisieras usar __dict__, tendrías que hacer algo como

def executeAFunction(self, name):
    A.__dict__[name](self)
3
Mark Bishop 7 ago. 2020 a las 14:21

__dict__ contiene los atributos de la instancia, pero no los atributos de la clase (están en el __dict__ de la clase en sí). Si desea realizar una búsqueda de la forma en que funcionan las llamadas a métodos (para que capten y enlacen métodos), no debe acceder a __dict__ directamente, solo use la getattr función que está diseñada para el propósito preciso para el que la estás usando (realizar el acceso con una cadena como si está haciendo una búsqueda de atributos con puntos):

def executeAFunction(self, name):
    getattr(self, name)  # This only looks it up, matching your code; call as getattr(self, name)()
2
ShadowRanger 7 ago. 2020 a las 14:17