Heim  >  Artikel  >  Backend-Entwicklung  >  Ist in Python selbstredundant?

Ist in Python selbstredundant?

anonymity
anonymityOriginal
2019-06-14 16:18:572402Durchsuche

self stellt eine Instanz einer Klasse dar, keine Klasse.

Ist in Python selbstredundant?

Schauen wir uns zunächst ein Beispiel an:

class Test:
  def prt(self):
    print(self)
    print(self.__class__)
  
t = Test()
t.prt()

Das Ausführungsergebnis ist wie folgt

<__main__.Test object at 0x000000000284E080>
<class &#39;__main__.Test&#39;>

Aus dem obigen Beispiel ist es offensichtlich, dass self eine Instanz einer Klasse darstellt. Und self.class zeigt auf die Klasse.

Kann ich nicht self schreiben?

Wenn wir im Python-Interpreter t.prt() aufrufen, interpretiert Python es tatsächlich als Test.prt(t). das heißt, ersetzen Sie self durch eine Instanz der Klasse.

Schreiben Sie die Zeile t.prt() oben neu, und die tatsächlichen Ergebnisse nach der Ausführung werden genau die gleichen sein.

Tatsächlich wurde teilweise erklärt, dass self bei der Definition nicht weggelassen werden kann

class Test:
  def prt():
    print(self)
  
t = Test()
t.prt()

Der Laufzeit-Erinnerungsfehler lautet wie folgt: prt hat bei der Definition keine Parameter, aber während der Definition wird ein Parameter zwangsweise übergeben Laufzeit.

Da t.prt() wie oben erklärt äquivalent zu Test.prt(t) ist, erinnert das Programm daran, dass ein weiterer Parameter t übergeben wird.

Traceback (most recent call last):
 File "h.py", line 6, in <module>
  t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given

Es ist in Ordnung, wenn Sie beim Definieren oder Aufrufen keine Klasseninstanz übergeben, es handelt sich um eine Klassenmethode.

class Test:
  def prt():
    print(__class__)
Test.prt()

Die laufenden Ergebnisse sind wie folgt

<class &#39;__main__.Test&#39;>

Bei der Vererbung ist die übergebene Instanz die übergebene Instanz, nicht die Instanz der Klasse, in der self definiert ist.

Schauen Sie sich zuerst den Code an

class Parent:
  def pprt(self):
    print(self)
  
class Child(Parent):
  def cprt(self):
    print(self)
c = Child()
c.cprt()
c.pprt()
p = Parent()
p.pprt()

Die laufenden Ergebnisse sind wie folgt

<__main__.Child object at 0x0000000002A47080>
<__main__.Child object at 0x0000000002A47080>
<__main__.Parent object at 0x0000000002A47240>

Erklärung:

Sie sollten nicht verstehen, wann Das Ausführen der c.cprt()-Frage bezieht sich auf eine Instanz der Child-Klasse.

Aber wenn c.pprt() ausgeführt wird, entspricht es Child.pprt(c), sodass self immer noch auf eine Instanz der Child-Klasse verweist, da die pprt()-Methode nicht in self definiert ist.

Beim Durchsuchen des Vererbungsbaums haben wir festgestellt, dass die Methode pprt() in der übergeordneten Klasse Parent definiert ist und daher erfolgreich aufgerufen werden kann.

Zusammenfassung

Selbst muss beim Definieren definiert werden, wird aber beim Aufruf automatisch übergeben. Der Name von

self ist nicht starr, aber es ist am besten, self gemäß der Konvention zu verwenden.

self bezieht sich beim Aufruf immer auf die Instanz der Klasse.

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

Stellungnahme:
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