Heim Backend-Entwicklung Python-Tutorial Super-Anrufdetails in Mehrfachvererbung

Super-Anrufdetails in Mehrfachvererbung

Nov 26, 2016 am 09:56 AM

Hinweis: Hier wird Python 3 als Betriebsumgebung verwendet und das Beispiel stammt aus Kapitel 8 des „Python-Kochbuchs“.

Wenn eine Unterklasse in Python die übergeordnete Klasse initialisieren möchte, gibt es zwei Hauptmethoden: Die erste besteht darin, den Namen der übergeordneten Klasse direkt zu übergeben, und die zweite darin, die Supermethode zu verwenden. Bei der Einzelvererbung gibt es keinen Unterschied zwischen den beiden, bei der Mehrfachvererbung gibt es jedoch einige subtile Unterschiede, die beachtet werden müssen. Beispielerklärung ist das letzte Wort!
1. Bei Verwendung des übergeordneten Klassennamens:

Python-Code

Klassenbasis:

def __init__(self):

print('Base.__init__')

class A(Base):

def __init__(self):

Base.__init__(self)

print('A.__init__')

class B(Base):

def __init__(self):

Base.__init__(self)

print('B.__init__')

class C(A,B):

def __init__(self ):

A.__init__(self)

B.__init__(self)

print('C.__init__')


This Bei der Instanziierung der C-Klasse sieht die Ausgabe wie folgt aus:

Python-Code

>>> c = C()

Base.__init__

A.__init__

Base.__init__

B.__init__

C.__init__

>>> >

Es ist ersichtlich, dass die Basisklasse zweimal aufgerufen wird. Dies dürfte in vielen Fällen nicht das gewünschte Ergebnis sein, daher können wir zu diesem Zeitpunkt die Verwendung der Super-Methode in Betracht ziehen.

2. Bei Verwendung von super:

Python-Code

class Base:

def __init__(self):

print('Base.__init__')                                                                                                                                            ()

print('A.__init__')

Klasse B (Basis):

def __init__ (self):

super().__init__()

print('B.__init__')

class C(A,B) :

def __init__(self):

super().__init__() # Nur ein Aufruf von super() hier

print('C.__init__')

Zu diesem Zeitpunkt lautet die Ausgabe der Instanziierung der Klasse C:

Python-Code

>>> c = C()

Base.__init__

B.__init__

A.__init__

C.__init__

>>> 🎜>

Sie können die Basis sehen. Wird die Klasse nur einmal aufgerufen? Aber leider hat mich das nicht dazu bewogen, diesen Blog-Eintrag zu schreiben, denn wenn Sie genau hinsehen, ist Ihnen aufgefallen, dass „B.__init__“ zuerst ausgegeben wird, obwohl die Basisklasse wie erwartet nur einmal aufgerufen wird, und dann „Einfach ausgeben“ A.__init__"? Und warum führt dies dazu, dass Base nur einmal initialisiert wird? Du bist bestimmt auch etwas verwirrt, oder? Tatsächlich muss all dies dem aufrufenden Prozess von super während der Mehrfachvererbung zugeschrieben werden. Wenn Python eine Klasse implementiert (nicht nur Vererbung), generiert es eine Methode zum Generieren einer Analysereihenfolgeliste, die über das Klassenattribut __mro__ angezeigt werden kann, wie in diesem Beispiel:

Python-Code

>>> C.__mro__

(, , ,

, )

>>>


Bei der Suche nach einer Eigenschaft oder Methode wird also jede Klasse gemäß dieser Liste durchlaufen, bis die erste Klasse gefunden wird, die dieser Eigenschaft oder Methode entspricht. Wenn Super bei der Vererbung verwendet wird, sucht der Interpreter jedes Mal, wenn er auf Super trifft, nach der nächsten Klasse in der Liste, bis er nicht mehr auf Super trifft oder die Liste durchlaufen wird, und kehrt dann Schicht für Schicht zurück, ähnlich wie bei der Rekursion. Daher ist der Suchvorgang in diesem Beispiel: Super in C finden -> Suche nach der nächsten Klasse in der Liste, also A -> Super erneut in A finden, nach B suchen -> Super erscheint wieder in B, search Base -> Initialisieren Sie die Base-Klasse und kehren Sie rekursiv zurück.
Um den Vorgang besser zu erklären, kommentieren Sie jetzt bitte die Superzeile der Klasse B aus:

Python-Code

Klasse B(Basis):

def __init__(self):

#super().__init__()

print('B.__init__')

class C( A,B):

def __init__(self):

super().__init__() # Nur ein Aufruf von super() hier

print('C. __init__')


Klasse C erneut instanziieren, die Ausgabe ist wie folgt:

Pythonn-Code

>>> )

B.__init__

A.__init__

C.__init__


Basisklasse erzeugt keine Ausgabe mehr! Warum? Da es in B kein Super gibt, kann die Liste nicht nach der Basisklasse suchen, sodass Base nicht initialisiert wird!


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

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

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)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Apr 02, 2025 am 07:15 AM

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Apr 02, 2025 am 07:18 AM

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Apr 01, 2025 pm 11:15 PM

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Apr 01, 2025 pm 10:51 PM

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen an? Uvicorn ist ein leichter Webserver, der auf ASGI basiert. Eine seiner Kernfunktionen ist es, auf HTTP -Anfragen zu hören und weiterzumachen ...

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

Wie bekomme ich Nachrichtendaten, die den Anti-Crawler-Mechanismus von Investing.com umgehen? Wie bekomme ich Nachrichtendaten, die den Anti-Crawler-Mechanismus von Investing.com umgehen? Apr 02, 2025 am 07:03 AM

Verständnis der Anti-Crawling-Strategie von Investing.com Viele Menschen versuchen oft, Nachrichten von Investing.com (https://cn.investing.com/news/latest-news) zu kriechen ...

See all articles