2017-11-02 28 views
0

Wie kann ich Python-Funktionen mit dynamischen Variablennamen aufrufen? Dies ist ein Beispiel:Name der dynamischen Funktionsvariablen

class test(object): 
    def __init__(self): 
     self.a, self.b, self.c = 1, 2 ,3 
    def __str__(self): 
     return "a: " + str(self.a) + \ 
          ", b: " + str(self.b) + \ 
          ", c:" + str(self.c)  
    def inc_a(self): 
     self.a += 1       

t1 = test() 
print(t1) 
t1.inc_a() # this is what I DON'T want, individual increment functions 
print(t1) 

# I would like a inc that works like this: 
# t1.inc(a) --> increase a by 1 
# t1.inc(b) --> increase b by 1 
# t1.inc(c) --> increase c by 1 
# print(t1) 

Thx & Art

Bezug
+0

eine Rückmeldung? hat es funktioniert? –

+0

Ja, es funktioniert, vielen Dank (hat dir schon ein Like gegeben)! Ich werde es bald als Lösung akzeptieren. Ich hoffe jedoch, dass jemand im Funktionsaufruf eine Lösung ohne Anführungszeichen vorschlägt. Ich mag die setattr/getattr Lösung sehr, aber ich dachte, dass es eine Lösung geben könnte, die Rs eval (substitute()) ähnelt. (Die Exec-Lösung sieht wie ein Äquivalent für R's eval (parse (text =)) aus.) –

+0

Ich fürchte, das wird in Python nicht möglich sein. Wenn du 't.inc (a)' nennst, muss 'a' ein bereits definiertes Objekt/eine Variable sein, ansonsten bekommst du 'NameError'. –

Antwort

2

Sie können es so einfach tun, indem exec:

class test(object): 
    def __init__(self): 
     self.a, self.b, self.c = 1, 2 ,3 
    def __str__(self): 
     return "a: " + str(self.a) + \ 
          ", b: " + str(self.b) + \ 
          ", c:" + str(self.c)  
    def inc(self, v): 
     exec("self.%s += 1" % (v)) 

OUTPUT

>>> t= test() 
>>> print(t) 
a: 1, b: 2, c:3 
>>> t.inc('a') 
>>> print(t) 
a: 2, b: 2, c:3 
>>> t.inc('b') 
>>> print(t) 
a: 2, b: 3, c:3 
>>> t.inc('c') 
>>> print(t) 
a: 2, b: 3, c:4 

aber es wäre bett er in Ihrem Fall zu verwenden setattr zusammen mit getattr da Sie versuchen, Werte für Klassenvariablen zu setzen, so dass Ihre inc Methode etwas wie folgt aussehen:

def inc(self, v): 
    setattr(self, v, getattr(self, v)+1) 

Ausgang: gleichen wie oben.

Verwandte Themen