Zwei Methoden, die von einer Methode in der Klasse geerbt wurden, unterscheiden sich in Instanzen, nicht wahr?

savchenkoto

Kann jemand bitte erklären, warum es so ist?

class Foo:
    def bar(self):
        pass

a = Foo()
b = Foo()

a.bar == b.bar # False
a.bar is b.bar # False

Ich dachte, dass beide die Klassenmethode erben und es die einzige Methode ist.

juanpa.arrivillaga

Wenn Sie über eine in der Klasse definierte Instanz auf eine Funktion zugreifen, wird jedes Mal ein Objekt mit gebundener Methode erstellt. Aus den Dokumenten :

Was genau passiert, wenn eine Methode aufgerufen wird? Möglicherweise haben Sie bemerkt, dass dies x.f()ohne ein Argument oben aufgerufen wurde, obwohl die Funktionsdefinition für f()ein Argument angegeben hat. Was ist mit dem Streit passiert? Sicherlich löst Python eine Ausnahme aus, wenn eine Funktion, die ein Argument erfordert, ohne eine aufgerufen wird - auch wenn das Argument nicht tatsächlich verwendet wird ...

Vielleicht haben Sie die Antwort erraten: Das Besondere an Methoden ist, dass das Instanzobjekt als erstes Argument der Funktion übergeben wird. In unserem Beispiel entspricht der Aufruf x.f()genau MyClass.f(x). Im Allgemeinen entspricht das Aufrufen einer Methode mit einer Liste von n Argumenten dem Aufrufen der entsprechenden Funktion mit einer Argumentliste, die durch Einfügen des Instanzobjekts der Methode vor dem ersten Argument erstellt wird.

Wenn Sie immer noch nicht verstehen, wie Methoden funktionieren, kann ein Blick auf die Implementierung möglicherweise die Dinge klären. Wenn auf ein Instanzattribut verwiesen wird, das kein Datenattribut ist, wird seine Klasse durchsucht. Wenn der Name ein gültiges Klassenattribut angibt, das ein Funktionsobjekt ist, wird ein Methodenobjekt erstellt, indem das Instanzobjekt und das gerade gefundene Funktionsobjekt in einem abstrakten Objekt gepackt werden (Zeiger darauf): Dies ist das Methodenobjekt.

Beachten Sie, dass dies jedes Mal geschieht, wenn Sie auf eine Methode zugreifen :

>>> class Foo:
...    def bar(self): pass
...
>>> f = Foo()
>>> f.bar is f.bar
False

Wie funktioniert das? Nun, eigentlich sind Funktionen Deskriptorobjekte . Beachten Sie das Vorhandensein von a __get__:

>>> def func(): pass
...
>>> func.__get__
<method-wrapper '__get__' of function object at 0x101e38ae8>

Mit anderen Worten, Sie können sich Python-Funktionen so vorstellen, dass sie folgendermaßen implementiert sind:

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

Natürlich sind sie nicht in Python implementiert (zumindest in CPython!).

Beachten Sie auch, dass der Zugriff auf die Funktion direkt in der Klasse dies natürlich nicht tut (zumindest in Python 3, das Sie in Ihrer Frage markiert haben):

>>> Foo.bar is Foo.bar
True

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Virtuelle Methoden, die von zwei Klassen geerbt wurden, können nicht aufgerufen werden

Hinzufügen von Methoden in einer Klasse, die von der abstrakten Basisklasse geerbt wurde?

Klassenmethode kann nicht typisiert werden, die sich von einer generischen Methode der abstrakten Klasse (TypeScript) erstreckt

Metaklassen: Warum wird die Methode nicht von der Basisklasse geerbt?

Methode, die außerhalb der Klassenverzögerung deklariert wurde, konnte nicht von der untergeordneten Klasse in Javascript geerbt werden

Methode nicht in abgeleiteter Klasse gefunden, die von abstrakter Klasse geerbt wurde

Überschreiben Sie mehrere Attribute, die von der übergeordneten Klasse in Python geerbt wurden

Ein Protokoll entspricht nicht einer Klasse, die von einer generischen übergeordneten Klasse geerbt wurde?

Wie verspotte ich eine Methode, die von einer abstrakten Klasse mit EasyMock geerbt wurde?

Auswerten von Methoden innerhalb einer Funktion, bei der die Methodenargumente nicht übergeben wurden

python3 decorator-Methode, die von der untergeordneten Klasse geerbt wurde

Beeinflusst die Sperre einer statisch synchronisierten Methode die nicht statisch synchronisierten Methoden ihrer Instanzen?

Ich verstehe die Ursache dieses AttributeError nicht, der von der übergeordneten Klasse geerbt werden sollte

Variiert die Reihenfolge der Methoden, die verschiedene Instanzen einer Klasse aufrufen

Zwei Methoden, die sich nur in optionalen Parametern unterscheiden

Zugriffsmitglied einer nicht virtuellen Basisklasse, die von zwei verschiedenen Klassen geerbt wurde

Unterscheiden sich PowerShell-Objekte, die von einer Remotesitzung zurückgegeben wurden?

Steigert das Hinzufügen von Methoden zu einer Java-Klasse die Speichernutzung ihrer Instanzen?

Fehler beim Verwenden von $ this, wenn nicht im Objektkontext für alle Methoden in einer Klasse außer der Methode __construct ()

Was ist die neue Methode, um alle Methoden einer Klasse abzurufen, einschließlich der geerbten Standardmethoden von Java 8?

Wie kann ich die Namen der Methoden ermitteln, die in einer Klasse verkettet wurden?

Die richtige Methode, um Methoden und Eigenschaften einer Klasse von einer anderen Methode innerhalb einer Methode zu adressieren

Wie definiere ich eine Methode, die die Instanz der aktuellen Klasse zurückgibt, nicht die Klasse, in der sie in Python geerbt wurde?

Instanzvariablen, die in einer Python-Klasse außerhalb von Methoden mit Typhinweisen deklariert wurden

Zwei verschiedene Objekte, die mit einer Klasse erstellt wurden, teilen sich den gleichen Speicher

Wie stellen Sie Variablen, die in einer Methode erstellt wurden, allen anderen Methoden in einer Klasse zur Verfügung?

Warum ist Cast erforderlich, um Methoden aufzurufen, die von Schnittstellen geerbt wurden?

R: Die Ergebnisse unterscheiden sich bei der Berechnung des euklidischen Abstands zwischen zwei Vektoren mit unterschiedlichen Methoden

Wenn sich in JS, ES6 und in einer Factory die Eigenschaft und der Parameter unterscheiden, kann die Methode sie nicht finden

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv