Inhaltsverzeichnis
Klasseneigenschaften/-methoden
Descriptor Protocol
Warum self In der Methodendefinition?
Heim Backend-Entwicklung Python-Tutorial Was ist der self-Parameter in Python?

Was ist der self-Parameter in Python?

May 08, 2023 pm 05:49 PM
python elf

Python 的"self"参数是什么?

Beginnen wir mit dem, was wir bereits wissen: self – der erste Parameter in der Methode – bezieht sich auf die Klasseninstanz:

class MyClass:
┌─────────────────┐
▼ │
def do_stuff(self, some_arg): │
print(some_arg)▲│
 ││
 ││
 ││
 ││
instance = MyClass() ││
instance.do_stuff("whatever") │
│ │
└───────────────────────────────┘
Nach dem Login kopieren

Außerdem muss dieses Argument nicht unbedingt self heißen – es ist einfach so eine Vereinbarung. Sie können es beispielsweise so verwenden, wie es in anderen Sprachen üblich ist.

Der obige Code mag natürlich und offensichtlich sein, weil Sie ihn verwendet haben, aber wir haben .do_stuff() nur einen Parameter (some_arg) gegeben, aber die Methode hat zwei deklariert (self und, some_arg), was auch zu sagen scheint: „Doesn'“ Das ergibt keinen Sinn. Der Pfeil im Snippet zeigt, dass self in eine Instanz übersetzt wird, aber wie wird es tatsächlich übergeben?

instance = MyClass()
MyClass.do_stuff(instance, "whatever")
Nach dem Login kopieren

Was Python intern tut, ist die Konvertierung von „instance.do_stuff(„whatever“)“ in „MyClass.do_stuff(instance, „whatever“)“. Wir könnten es hier „Python-Magie“ nennen, aber wenn wir wirklich verstehen wollen, was sich hinter den Kulissen abspielt, müssen wir verstehen, was Python-Methoden sind und wie sie sich auf Funktionen beziehen.

Klasseneigenschaften/-methoden

In Python gibt es kein „Methoden“-Objekt – tatsächlich sind Methoden nur reguläre Funktionen. Der Unterschied zwischen Funktionen und Methoden besteht darin, dass Methoden im Namensraum einer Klasse definiert werden, wodurch sie zu Eigenschaften dieser Klasse werden.

Diese Eigenschaften werden im Klassenwörterbuch __dict__ gespeichert und wir können direkt darauf zugreifen oder die integrierte Vars-Funktion verwenden:

MyClass.__dict__["do_stuff"]
# <function MyClass.do_stuff at 0x7f132b73d550>
vars(MyClass)["do_stuff"]
# <function MyClass.do_stuff at 0x7f132b73d550>
Nach dem Login kopieren

Der gebräuchlichste Weg, auf sie zuzugreifen, ist die „Klassenmethode“-Methode:

print(MyClass.do_stuff)
# <function MyClass.do_stuff at 0x7f132b73d550>
Nach dem Login kopieren

Hier wird beim Zugriff auf die Funktion über das Klassenattribut wie erwartet ausgegeben, dass do_stuff eine Funktion von MyClass ist. Wir können jedoch auch über Instanzeigenschaften darauf zugreifen:

print(instance.do_stuff)
# <bound method MyClass.do_stuff of <__main__.MyClass object at 0x7ff80c78de50>
Nach dem Login kopieren

In diesem Fall erhalten wir jedoch eine „gebundene Methode“ anstelle der ursprünglichen Funktion. Was Python hier für uns tut, ist, dass es Klassenattribute an Instanzen bindet und so sogenannte „gebundene Methoden“ erstellt. Diese „gebundene Methode“ ist ein Wrapper um die zugrunde liegende Funktion, der die Instanz bereits als erstes Argument (self) einfügt.

Methoden sind also gewöhnliche Funktionen, an deren anderen Parameter eine Klasseninstanz (self) angehängt ist.

Um zu verstehen, wie das passiert, müssen wir einen Blick auf das Deskriptorprotokoll werfen.

Descriptor Protocol

Deskriptoren sind der Mechanismus hinter Methoden. Sie sind Objekte (Klassen), die die Methoden __get__(), __set__() oder __delete__() definieren. Um zu verstehen, wie self funktioniert, betrachten wir einfach __get__(), das eine Signatur hat:

descr.__get__(self, instance, type=None) -> value
Nach dem Login kopieren

Aber was macht die Methode __get__() eigentlich? Es ermöglicht uns, die Eigenschaftssuche in einer Klasse anzupassen – oder mit anderen Worten: anzupassen, was passiert, wenn auf Klasseneigenschaften mithilfe der Punktnotation zugegriffen wird. Dies ist sehr nützlich, wenn man bedenkt, dass Methoden eigentlich nur Eigenschaften der Klasse sind. Das bedeutet, dass wir die Methode __get__ verwenden können, um eine „gebundene Methode“ einer Klasse zu erstellen.

Um das Verständnis zu erleichtern, demonstrieren wir dies, indem wir eine „Methode“ mithilfe von Deskriptoren implementieren. Zuerst erstellen wir eine reine Python-Implementierung eines Funktionsobjekts:

import types
class Function:
def __get__(self, instance, objtype=None):
if instance is None:
return self
return types.MethodType(self, instance)
def __call__(self):
return
Nach dem Login kopieren

Die obige Function-Klasse implementiert __get__ , was sie zu einem Deskriptor macht. Diese spezielle Methode empfängt die Klasseninstanz im Instanzparameter – wenn dieser Parameter None ist, wissen wir, dass die __get__-Methode direkt von einer Klasse (z. B. MyClass.do_stuff) aufgerufen wurde, also geben wir einfach self zurück. Wenn es jedoch von einer Klasseninstanz wie „instance.do_stuff“ aufgerufen wird, geben wir „types.MethodType“ zurück, was eine Möglichkeit zum manuellen Erstellen einer „gebundenen Methode“ darstellt.

Darüber hinaus bieten wir auch die spezielle Methode __call__ an. __init__ wird aufgerufen, wenn eine Klasse aufgerufen wird, um eine Instanz zu initialisieren (z. B. Instanz = MyClass()), während __call__ aufgerufen wird, wenn eine Instanz aufgerufen wird (z. B. Instanz()). Wir müssen dies verwenden, da self intypes.MethodType(self,instance) aufrufbar sein muss.

Da wir nun unsere eigene Funktionsimplementierung haben, können wir diese verwenden, um Methoden an die Klasse zu binden:

class MyClass:
do_stuff = Function()
print(MyClass.__dict__["do_stuff"])# __get__ not invoked
# <__main__.Function object at 0x7f229b046e50>
print(MyClass.do_stuff)# __get__ invoked, but "instance" is None, "self" is returned
print(MyClass.do_stuff.__get__(None, MyClass))
# <__main__.Function object at 0x7f229b046e50>
instance = MyClass()
print(instance.do_stuff)#__get__ invoked and "instance" is not None, "MethodType" is returned
print(instance.do_stuff.__get__(instance, MyClass))
# <bound method ? of <__main__.MyClass object at 0x7fd526a33d30>
Nach dem Login kopieren

Indem wir MyClass ein Attribut do_stuff vom Typ Function geben, simulieren wir grob Pythons Definition von Methoden im Namensraum der Klasse Dinge, die damals gemacht wurden.

Zusammenfassend lässt sich sagen, dass beim Zugriff auf Attribute wie „instance.do_stuff“ nach „do_stuff“ im Attributwörterbuch (__dict__) der Instanz gesucht wird. Wenn do_stuff eine __get__-Methode definiert, wird do_stuff.__get__ aufgerufen und ruft letztendlich Folgendes auf:

# For class invocation:
print(MyClass.__dict__['do_stuff'].__get__(None, MyClass))
# <__main__.Function object at 0x7f229b046e50>
# For instance invocation:
print(MyClass.__dict__['do_stuff'].__get__(instance, MyClass))
# Alternatively:
print(type(instance).__dict__['do_stuff'].__get__(instance, type(instance)))
# <bound method ? of <__main__.MyClass object at 0x7fd526a33d30>
Nach dem Login kopieren

Wie wir jetzt wissen, wird eine gebundene Methode zurückgegeben – ein aufrufbarer Wrapper um die ursprüngliche Funktion, dessen Argumenten self vorangestellt ist!

Wenn Sie dies weiter untersuchen möchten, können Sie statische und Klassenmethoden auf ähnliche Weise implementieren (https://docs.python.org/3.7/howto/descriptor.html#static-methods-and-class-methods)

Warum self In der Methodendefinition?

Wir wissen jetzt, wie es funktioniert, aber es gibt eine philosophischere Frage: „Warum muss es in der Methodendefinition vorhanden sein?“

Der explizite Methodenparameter self ist eine umstrittene Designentscheidung, aber eine A-Wahl das begünstigt die Einfachheit.

Python verkörpert selbst die Designphilosophie „Schlimmer ist besser“ – hier beschrieben. Die Priorität dieser Designphilosophie ist „Einfachheit“, definiert als:

Das Design muss einfach sein, einschließlich Implementierung und Schnittstellen. Wichtiger ist, dass die Implementierung einfach ist als die Schnittstelle...

Genau das ist bei self der Fall – eine einfache Implementierung auf Kosten der Schnittstelle, bei der die Methodensignatur nicht mit ihrem Aufruf übereinstimmt.

Es gibt natürlich noch weitere Gründe, warum wir self explizit schreiben sollten oder warum es erhalten bleiben muss, von denen einige in einem Blogbeitrag von Guido van Rossum beschrieben werden (http://neopythonic.blogspot.com/2008/10/ why-explicit-self-has-to-stay.html) reagierte der Artikel auf einen Antrag auf Entfernung.

Python abstrahiert viel Komplexität, aber meiner Meinung nach ist das Eintauchen in die Details und die Komplexität auf niedriger Ebene äußerst wertvoll, um besser zu verstehen, wie die Sprache funktioniert, wenn etwas kaputt geht und eine erweiterte Fehlerbehebung/Debugging nicht sinnvoll genug ist.

Außerdem kann das Verständnis von Deskriptoren tatsächlich sehr praktisch sein, da sie einige Anwendungsfälle haben. Während Sie in den meisten Fällen nur @property-Deskriptoren benötigen, gibt es einige Fälle, in denen benutzerdefinierte Deskriptoren sinnvoll sind, z. B. die in SLQAlchemy oder z. B. benutzerdefinierte Validatoren.

Das obige ist der detaillierte Inhalt vonWas ist der self-Parameter in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Muss MySQL bezahlen? Muss MySQL bezahlen? Apr 08, 2025 pm 05:36 PM

MySQL hat eine kostenlose Community -Version und eine kostenpflichtige Enterprise -Version. Die Community -Version kann kostenlos verwendet und geändert werden, die Unterstützung ist jedoch begrenzt und für Anwendungen mit geringen Stabilitätsanforderungen und starken technischen Funktionen geeignet. Die Enterprise Edition bietet umfassende kommerzielle Unterstützung für Anwendungen, die eine stabile, zuverlässige Hochleistungsdatenbank erfordern und bereit sind, Unterstützung zu bezahlen. Zu den Faktoren, die bei der Auswahl einer Version berücksichtigt werden, gehören Kritikalität, Budgetierung und technische Fähigkeiten von Anwendungen. Es gibt keine perfekte Option, nur die am besten geeignete Option, und Sie müssen die spezifische Situation sorgfältig auswählen.

So verwenden Sie MySQL nach der Installation So verwenden Sie MySQL nach der Installation Apr 08, 2025 am 11:48 AM

Der Artikel führt den Betrieb der MySQL -Datenbank vor. Zunächst müssen Sie einen MySQL -Client wie MySQLworkBench oder Befehlszeilen -Client installieren. 1. Verwenden Sie den Befehl mySQL-uroot-P, um eine Verbindung zum Server herzustellen und sich mit dem Stammkonto-Passwort anzumelden. 2. Verwenden Sie die Erstellung von Createdatabase, um eine Datenbank zu erstellen, und verwenden Sie eine Datenbank aus. 3.. Verwenden Sie CreateTable, um eine Tabelle zu erstellen, Felder und Datentypen zu definieren. 4. Verwenden Sie InsertInto, um Daten einzulegen, Daten abzufragen, Daten nach Aktualisierung zu aktualisieren und Daten nach Löschen zu löschen. Nur indem Sie diese Schritte beherrschen, lernen, mit gemeinsamen Problemen umzugehen und die Datenbankleistung zu optimieren, können Sie MySQL effizient verwenden.

MySQL kann nach dem Herunterladen nicht installiert werden MySQL kann nach dem Herunterladen nicht installiert werden Apr 08, 2025 am 11:24 AM

Die Hauptgründe für den Fehler bei MySQL -Installationsfehlern sind: 1. Erlaubnisprobleme, Sie müssen als Administrator ausgeführt oder den Sudo -Befehl verwenden. 2. Die Abhängigkeiten fehlen, und Sie müssen relevante Entwicklungspakete installieren. 3. Portkonflikte müssen Sie das Programm schließen, das Port 3306 einnimmt, oder die Konfigurationsdatei ändern. 4. Das Installationspaket ist beschädigt. Sie müssen die Integrität herunterladen und überprüfen. 5. Die Umgebungsvariable ist falsch konfiguriert und die Umgebungsvariablen müssen korrekt entsprechend dem Betriebssystem konfiguriert werden. Lösen Sie diese Probleme und überprüfen Sie jeden Schritt sorgfältig, um MySQL erfolgreich zu installieren.

Die MySQL -Download -Datei ist beschädigt und kann nicht installiert werden. Reparaturlösung Die MySQL -Download -Datei ist beschädigt und kann nicht installiert werden. Reparaturlösung Apr 08, 2025 am 11:21 AM

Die MySQL -Download -Datei ist beschädigt. Was soll ich tun? Wenn Sie MySQL herunterladen, können Sie die Korruption der Datei begegnen. Es ist heutzutage wirklich nicht einfach! In diesem Artikel wird darüber gesprochen, wie dieses Problem gelöst werden kann, damit jeder Umwege vermeiden kann. Nach dem Lesen können Sie nicht nur das beschädigte MySQL -Installationspaket reparieren, sondern auch ein tieferes Verständnis des Download- und Installationsprozesses haben, um zu vermeiden, dass Sie in Zukunft stecken bleiben. Lassen Sie uns zunächst darüber sprechen, warum das Herunterladen von Dateien beschädigt wird. Dafür gibt es viele Gründe. Netzwerkprobleme sind der Schuldige. Unterbrechung des Download -Prozesses und der Instabilität im Netzwerk kann zu einer Korruption von Dateien führen. Es gibt auch das Problem mit der Download -Quelle selbst. Die Serverdatei selbst ist gebrochen und natürlich auch unterbrochen, wenn Sie sie herunterladen. Darüber hinaus kann das übermäßige "leidenschaftliche" Scannen einer Antiviren -Software auch zu einer Beschädigung von Dateien führen. Diagnoseproblem: Stellen Sie fest, ob die Datei wirklich beschädigt ist

Lösungen für den Dienst, der nach der MySQL -Installation nicht gestartet werden kann Lösungen für den Dienst, der nach der MySQL -Installation nicht gestartet werden kann Apr 08, 2025 am 11:18 AM

MySQL hat sich geweigert, anzufangen? Nicht in Panik, lass es uns ausprobieren! Viele Freunde stellten fest, dass der Service nach der Installation von MySQL nicht begonnen werden konnte, und sie waren so ängstlich! Mach dir keine Sorgen, dieser Artikel wird dich dazu bringen, ruhig damit umzugehen und den Mastermind dahinter herauszufinden! Nachdem Sie es gelesen haben, können Sie dieses Problem nicht nur lösen, sondern auch Ihr Verständnis von MySQL -Diensten und Ihren Ideen zur Fehlerbehebungsproblemen verbessern und zu einem leistungsstärkeren Datenbankadministrator werden! Der MySQL -Dienst startete nicht und es gibt viele Gründe, von einfachen Konfigurationsfehlern bis hin zu komplexen Systemproblemen. Beginnen wir mit den häufigsten Aspekten. Grundkenntnisse: Eine kurze Beschreibung des Service -Startup -Prozesses MySQL Service Startup. Einfach ausgedrückt, lädt das Betriebssystem MySQL-bezogene Dateien und startet dann den MySQL-Daemon. Dies beinhaltet die Konfiguration

So optimieren Sie die Datenbankleistung nach der MySQL -Installation So optimieren Sie die Datenbankleistung nach der MySQL -Installation Apr 08, 2025 am 11:36 AM

Die MySQL -Leistungsoptimierung muss von drei Aspekten beginnen: Installationskonfiguration, Indexierung und Abfrageoptimierung, Überwachung und Abstimmung. 1. Nach der Installation müssen Sie die my.cnf -Datei entsprechend der Serverkonfiguration anpassen, z. 2. Erstellen Sie einen geeigneten Index, um übermäßige Indizes zu vermeiden und Abfrageanweisungen zu optimieren, z. B. den Befehl Erklärung zur Analyse des Ausführungsplans; 3. Verwenden Sie das eigene Überwachungstool von MySQL (ShowProcessList, Showstatus), um die Datenbankgesundheit zu überwachen und die Datenbank regelmäßig zu sichern und zu organisieren. Nur durch kontinuierliche Optimierung dieser Schritte kann die Leistung der MySQL -Datenbank verbessert werden.

Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Apr 08, 2025 pm 06:03 PM

Die MySQL-Datenbankleistung Optimierungshandbuch In ressourcenintensiven Anwendungen spielt die MySQL-Datenbank eine entscheidende Rolle und ist für die Verwaltung massiver Transaktionen verantwortlich. Mit der Erweiterung der Anwendung werden jedoch die Datenbankleistung Engpässe häufig zu einer Einschränkung. In diesem Artikel werden eine Reihe effektiver Strategien zur Leistungsoptimierung von MySQL -Leistung untersucht, um sicherzustellen, dass Ihre Anwendung unter hohen Lasten effizient und reaktionsschnell bleibt. Wir werden tatsächliche Fälle kombinieren, um eingehende Schlüsseltechnologien wie Indexierung, Abfrageoptimierung, Datenbankdesign und Caching zu erklären. 1. Das Design der Datenbankarchitektur und die optimierte Datenbankarchitektur sind der Eckpfeiler der MySQL -Leistungsoptimierung. Hier sind einige Kernprinzipien: Die Auswahl des richtigen Datentyps und die Auswahl des kleinsten Datentyps, der den Anforderungen entspricht, kann nicht nur Speicherplatz speichern, sondern auch die Datenverarbeitungsgeschwindigkeit verbessern.

Braucht MySQL das Internet? Braucht MySQL das Internet? Apr 08, 2025 pm 02:18 PM

MySQL kann ohne Netzwerkverbindungen für die grundlegende Datenspeicherung und -verwaltung ausgeführt werden. Für die Interaktion mit anderen Systemen, Remotezugriff oder Verwendung erweiterte Funktionen wie Replikation und Clustering ist jedoch eine Netzwerkverbindung erforderlich. Darüber hinaus sind Sicherheitsmaßnahmen (wie Firewalls), Leistungsoptimierung (Wählen Sie die richtige Netzwerkverbindung) und die Datensicherung für die Verbindung zum Internet von entscheidender Bedeutung.

See all articles