2016-04-29 21 views
1

Ich bin mir über späte Bindungen in Schleife in Python bewusst, aber ich finde keine Möglichkeit, dies zu lösen.Bind-Methode zu Objekt Laufzeit-Bindung spät

def bind_method(object, methods): 

    for method in methods: 
     def my_method(): 
      result = method() 

      return result 

     setattr(object, method.__name__, my_method) 

def test(): 
    class A: pass 

    def bar(): 
     return "BAR" 

    def foo(): 
     return "FOO" 

    a = A() 
    bind_method(a, [bar, foo]) 

    assert a.foo() == "FOO" 
    assert a.bar() == "BAR" 


if __name__ == "__main__": 
    test() 

Ich habe versucht, mit partial in functools aber nicht den Erfolg bekommen :(

+0

@AKS Fehler Tippfehler :(die Post korrigieren – Nilesh

+0

Bitte überprüfen Sie meine Antwort aktualisiert – AKS

Antwort

1

Wenn Sie anrufen a.bar()my_method aufgerufen wird, und da der for-Schleife hat den Wert von method endete für sie das letzte Element in methods Liste so erhalten Sie immer "FOO" als Ergebnis

Um zu überprüfen, können Sie eine print-Anweisung hinzufügen.

def my_method(): 
    print(method.__name__) # this will always print `foo` 
    result = method() 

Aber wenn ich stellte es direkt:

def bind_method(object, methods): 
    for method in methods: 
     setattr(object, method.__name__, method) 

Es funktioniert.


Mit functools.partial:

from functools import partial 

def bind_method(object, methods): 

    for method in methods: 
     def my_method(a_method): 
      print(a_method.__name__) # this print correct method name 
      result = a_method() 
      return result 

     setattr(object, method.__name__, partial(my_method, method)) 
+1

Sein jetzt arbeiten, aber, wie es funktioniert mit teilweise, wenn Sie dann erklären.? Es hilft, dieses Konzept zu verstehen. – Nilesh

+0

Es ist bereits hier erklärt: [Wie funktionieren die functools teilweise in Python?] (http://stackoverflow.com/questions/15331726/how-does-the-functools-partial-work- In-Python) – AKS