2009-06-17 21 views
6

¿Hay alguna forma de que use una cadena para llamar a un método de una clase? He aquí un ejemplo que se espera que explicar mejor (utilizando la forma en que pienso que debería ser):Usando cadena como nombre de variable

class helloworld(): 
    def world(self): 
     print "Hello World!" 

str = "world" 
hello = helloworld() 

hello.`str`() 

lo que la salida Hello World!.

Gracias de antemano.

+0

caso de que la salida sea "hola mundo" o "Hola Mundo! "? – Buddy

Respuesta

16

Puede utilizar getattr:

>>> class helloworld: 
...  def world(self): 
...   print("Hello World!") 
... 
>>> m = "world" 
>>> hello = helloworld() 
>>> getattr(hello, m)() 
Hello World! 
  • Tenga en cuenta que los parens en class helloworld() como en su ejemplo son innecesarias, en este caso.
  • Y, como señala SilentGhost, str es un nombre desafortunado para una variable.
+4

str es una mala elección para un nombre de variable. – SilentGhost

-3

una forma es que puede establecer las variables a ser igual funciona igual que los datos

def thing1(): 
    print "stuff" 

def thing2(): 
    print "other stuff" 

avariable = thing1 
avariable() 
avariable = thing2 
avariable() 

Y la salida te obtiene es

stuff 
other stuff 

Entonces usted puede conseguir más complicado y tener

somedictionary["world"] = world 
somedictionary["anotherfunction"] = anotherfunction 

y así sucesivamente. Si desea compilar automáticamente a los métodos de módulos en el uso del diccionario dir()

+2

¿Cómo se puede obtener el resultado de thing1 llamando a blah? –

2

Advertencia: exec es una función peligroso usar, estudiar antes de usarlo

También puede utilizar la función incorporada "ejecutivo":

>>> def foo(): print('foo was called'); 
... 
>>> some_string = 'foo'; 
>>> exec(some_string + '()'); 
foo was called 
>>> 
+3

Realmente no es una buena idea. ejecutivo debe evitarse cuando sea posible. getattr está hecho para este problema. – Stephan202

+2

No confunda * cómo * hacer algo con si es * seguro * o no. El ejecutivo es de hecho una función peligrosa de usar. Sin embargo, hay formas de usarlo de forma segura. En este caso, puede pasar los diccionarios de contexto "globales" y "locales" para ejecutar Exec en un "entorno limitado". – AgentLiquid

+1

He oído cosas terribles sobre exec(), pero esto funcionó a la perfección. –

-3

lo que estás buscando es exec

class helloworld(): 
    def world(self): 
     print "Hello World!" 

str = "world" 
hello = helloworld() 

completeString = "hello.%s()" % str 

exec(completString) 
+1

eso es simplemente incorrecto – SilentGhost

+0

Nunca he usado "exec" antes, pero creo que lo reconsideraré ... Up-modding. –

Cuestiones relacionadas