Python3: bind-Methode zur Klasseninstanz mit .__ get __ (), es funktioniert aber warum?

Ich weiß, wenn Sie eine Methode zu einer Klasseninstanz hinzufügen möchten, können Sie nicht eine einfache Zuweisung wie folgt machen:

>>> def print_var(self): # method to be added print(self.var) >>> class MyClass: var = 5 >>> c = MyClass() >>> c.print_var = print_var 

Dies würde in der Tat dazu führen, dass print_var sich wie eine normale Funktion verhält, so dass das self Argument nicht seine typische Bedeutung hätte:

 >>> c.print_var <function print_var at 0x98e86ec> >>> c.print_var() Traceback (most recent call last): File "<pyshell#149>", line 1, in <module> c.print_var() TypeError: print_var() takes exactly 1 argument (0 given) 

Um die Funktion als eine Methode betrachtet zu werden (dh sie an die Instanz zu binden) habe ich diesen Code benutzt:

 >>> import types >>> c.print_var = types.MethodType(print_var, c) >>> c.print_var <bound method MyClass.print_var of <__main__.MyClass object at 0x98a1bac>> >>> c.print_var() 5 

Aber ich habe festgestellt, dass .__get__ auch für diesen Zweck verwendet werden kann:

 >>> c.print_var = print_var.__get__(c) >>> c.print_var <bound method MyClass.print_var of <__main__.MyClass object at 0x98a1bac>> >>> c.print_var() 5 

Das Problem hier ist, dass es nur funktioniert, aber ich kann nicht verstehen, wie und warum. Die Dokumentation über .__get__ scheint nicht sehr viel zu helfen.

Ich würde mich freuen, wenn jemand dieses Verhalten von Pythons Dolmetscher klären könnte.

One Solution collect form web for “Python3: bind-Methode zur Klasseninstanz mit .__ get __ (), es funktioniert aber warum?”

Die Informationen, die Sie suchen, sind im Deskriptor HowTo Guide :

Zur Unterstützung von Methodenaufrufen beinhaltet die Funktion die Methode __get__() für die Bindung von Methoden beim Attributzugriff. Dies bedeutet, dass alle Funktionen Nicht-Daten-Deskriptoren sind, die gebundene oder ungebundene Methoden zurückgeben, je nachdem, ob sie von einem Objekt oder einer Klasse aufgerufen werden. Im reinen Python funktioniert es so:

 class Function(object): . . . def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" return types.MethodType(self, obj, objtype) 

Also gibt es wirklich nichts merkwürdiges los – die __get__ Methode eines Funktionsobjekts ruft types.MethodType und gibt das Ergebnis zurück.

  • Erstellen Sie eine Scheibe mit einem Tupel
  • Erstellen von exe-Datei mit cx_Freeze, PyQt4, matplotlib und mehrere .py-Dateien funktioniert nicht
  • Erstellen Sie eine Schreibmaschine-Effekt-Animation für Strings in Python
  • Python <Keine solche Datei oder Verzeichnis: 'gs'> Fehler auch bei GhostScript auf Macintosh installiert * Problem noch anhaltend! *
  • Konvertieren von String zu Int ohne int ()
  • Was bedeutet das -> (dash-größer-als Pfeilsymbol) in einer Python-Methode Signatur?
  • Python: Schreiben und Lesen von Binärdaten in eine Datei
  • Mit Einheimischen () im Wörterbuchverstehen
  • Parse-Zeilen-Daten bis Keyword mit Pyparsing
  • Schwierigkeiten mit der Zeit haben
  • Pip install - locale.Error: nicht unterstützte Gebietsschema-Einstellung
  • Python ist die beste Programmiersprache der Welt.