2009-06-17 20 views
6

Czy jest jakiś sposób, aby użyć ciągu do wywołania metody klasy? Oto przykład, który miejmy nadzieję wyjaśnić lepiej (stosując sposób myślę, że powinno być):Używanie ciągu znaków jako nazwy zmiennej

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

str = "world" 
hello = helloworld() 

hello.`str`() 

które wyjście będzie Hello World!.

Z góry dziękuję.

+0

Jeżeli wyjście jest "Hello world" czy „Hello Świat! "? – Buddy

Odpowiedz

16

Można użyć getattr:

>>> class helloworld: 
...  def world(self): 
...   print("Hello World!") 
... 
>>> m = "world" 
>>> hello = helloworld() 
>>> getattr(hello, m)() 
Hello World! 
  • Zauważ, że nawiasy w class helloworld() jak w przykładzie są niepotrzebne w tym przypadku.
  • I, jak wskazuje SilentGhost, str to niefortunna nazwa zmiennej.
+4

str jest złym wyborem dla nazwy zmiennej. – SilentGhost

-3

jeden sposób to można ustawić zmienne być równa funkcji podobnie jak dane

def thing1(): 
    print "stuff" 

def thing2(): 
    print "other stuff" 

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

a wyjście you'l uzyskać jest

stuff 
other stuff 

Następnie można uzyskać bardziej skomplikowane i mają

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

i tak dalej. Jeżeli chcesz automatycznie skompilować metod moduły nad wykorzystaniem słownika dir()

+2

Jak można uzyskać wyjście z rzeczy 1 przez wywołanie blah? –

2

Ostrzeżenie: Exec jest niebezpieczna funkcja w użyciu, uczyć go przed użyciem

Można także skorzystać z wbudowanej funkcji "exec":

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

To naprawdę nie jest dobry pomysł. exec należy unikać, gdy jest to możliwe. getattr jest tworzony dla tego problemu. – Stephan202

+2

Nie należy mylić * jak * robić czegoś z tym, czy jest to * bezpieczne *, czy nie. exec jest rzeczywiście niebezpieczną funkcją do użycia. Istnieją jednak sposoby bezpiecznego korzystania z niego. W tym przypadku można przekazać słowniki kontekstowe "globals" i "locals" w celu uruchomienia exec w "piaskownicy". – AgentLiquid

+1

Słyszałem okropne rzeczy o exec(), ale to działało idealnie. –

-3

czego szukasz exec

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

str = "world" 
hello = helloworld() 

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

exec(completString) 
+1

To jest po prostu niewłaściwe – SilentGhost

+0

Nigdy wcześniej nie używałam "exec", ale myślę, że jeszcze raz się zastanowię ... Upmodowanie. –

Powiązane problemy