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.

  • Entfernen von Steuerzeichen aus einer Zeichenfolge in Python
  • Wo finde ich den QWebPage und den Pymongo in python3.4?
  • Python 3.4 - Text zu Sprache mit SAPI
  • Sortierung in python - wie man eine Liste mit alphanumerischen Werten sortiert?
  • Parallel-Datei-Parsing, mehrere CPU-Kerne
  • Python 3 Ersatz für PyFile_AsFile
  • Was ist das '@ =' Symbol für in Python?
  • Zählphrase-Frequenz in Python 3.3.2
  • Python auf FreeBSD installieren 8.1
  • In Python, `Pip-r requirements.txt` nicht installieren Pakete * rekursiv *?
  • Weg, um festzustellen, ob X und Y beide über 0 sind
  • Python ist die beste Programmiersprache der Welt.