Vererbung in der objektorientierten Programmierung

Inhalt

Überblick

  • Erfahren Sie mehr über Vererbung in der objektorientierten Programmierung und verschiedene Formen der Vererbung
  • Methodenüberschreibung und Superfunktion verstehen () in der Welt der objektorientierten Programmierung

Einführung

Vererbung ist einer der wichtigsten Aspekte der objektorientierten Programmierung (OOP). Der Schlüssel zum Verständnis der Vererbung liegt darin, dass sie die Wiederverwendung von Code ermöglicht. Anstatt den gleichen Code zu schreiben, und wieder, wir können einfach die Eigenschaften einer Klasse in die andere vererben.

Dies, wie kannst du dir das vorstellen, viel zeit sparen. Und Zeit ist Geld in der Datenwissenschaft!

Vererbung-in-oop-9792497

Objektorientierte Programmierung befasst sich mit Objekten der realen Welt und Vererbung ist eine Möglichkeit, Beziehungen der realen Welt darzustellen. Hier ist ein Beispiel: Wagen, Bus, Fahrrad – sie alle gehören zu einer breiteren Kategorie namens Fahrzeug. Das bedeutet, dass sie die Eigenschaften von Klassenfahrzeugen geerbt haben, nämlich, alle werden für den Transport verwendet.

Wir können diese Beziehung mit Hilfe von Vererbung im Code darstellen.

Ein weiterer faszinierender Aspekt der Vererbung ist, dass sie von Natur aus transitiv ist.. Aber was bedeutet das? Wir werden später in diesem Artikel im Detail sehen. Python unterstützt auch verschiedene Arten der Vererbung, die ich in diesem Artikel ausführlich behandeln werde..

Dies ist der zweite Artikel in der Artikelserie zur objektorientierten Programmierung. Lesen Sie auch den ersten Artikel:

Inhaltsverzeichnis

  1. Was ist Vererbung in der objektorientierten Programmierung??
  2. Unterschiedliche Formen der Vererbung in der objektorientierten Programmierung
    • Einzigartiges Erbe
    • Mehrfachvererbung
    • Mehrstufige Vererbung
    • Hierarchische Vererbung
    • Hybride Vererbung
  3. Methodenüberschreibung
  4. Die Superfunktion ()

Was ist Vererbung in der objektorientierten Programmierung??

Vererbung ist das Verfahren, bei dem eine Klasse die Attribute und Methoden einer anderen Klasse erbt. Die Klasse, deren Eigenschaften und Methoden vererbt werden, wird als Hauptklasse bezeichnet. Und die Klasse, die die Eigenschaften der Hauptklasse erbt, ist die Child-Klasse.

Das Interessante ist das, zusammen mit geerbten Eigenschaften und Methoden, eine untergeordnete Klasse kann ihre eigenen Eigenschaften und Methoden haben.

Sie können die folgende Syntax verwenden: Vererbung in Python implementieren:

Klasse parent_class:
Körper der Elternklasse

Klasse child_class( parent_class):
Körper der Kinderklasse

Schauen wir uns die Umsetzung an:

Klasse Auto:          #parent class

    def __init__(selbst, Name, Kilometerstand):
        self.name = name 
        self.mileage = mileage 

    def description(selbst):                
        zurück f"Die {selbst.name} Auto gibt den Kilometerstand von {selbst.Kilometerstand}km/l"

Klasse BMW(Auto):     #Kinderklasse
    passieren

Klasse Audi(Auto):     #Kinderklasse
    def audi_desc(selbst):
        Rückkehr "Dies ist die Beschreibungsmethode der Klasse Audi."
obj1 = BMW("BMW 7er",39.53)
drucken(obj1.beschreibung())

obj2 = Audi("Audi A8 L",14)
drucken(obj2.beschreibung())
drucken(obj2.audi_desc())

Produktion:

a13-4443158

Wir haben zwei Sekundarklassen geschaffen, nämlich, „BMW“ Ja „Audi“, die die Methoden und Eigenschaften der Hauptklasse geerbt haben „Auto“. Wir haben in der BMW-Klasse keine zusätzlichen Funktionen und Methoden bereitgestellt. Während es innerhalb der Audi-Klasse eine zusätzliche Methode gibt.

Beachten Sie, wie Objekte in untergeordneten Klassen auf die Beschreibungsinstanzmethode zugreifen können () der Hauptklasse mit Hilfe von obj1.description () y obj2.beschreibung (). Und auf die separate Methode der Audi-Klasse kann auch über obj2.audi_desc zugegriffen werden ().

Wir können die Basis- oder Elternklasse jeder Klasse mit einem integrierten Klassenattribut überprüfen __basen__

drucken(BMW.__basen__, Audi.__basen__)
screenshot-from-2020-09-28-20-44-53-3987278

Wie können wir hier, die Basisklasse beider Unterklassen ist Auto. Jetzt, Mal sehen, was passiert, wenn __base__ mit der Elternklasse Car verwendet wird:

drucken( Auto.__basen__ )

screenshot-from-2020-09-30-17-59-33-3279774

Immer wenn wir eine neue Klasse in Python 3.x erstellen, erbt von einer integrierten Basisklasse namens Objekt. Mit anderen Worten, class Object ist die Wurzel aller Klassen.

Vererbungsformen in der objektorientierten Programmierung

Allgemein, es gibt fünf Vererbungsformen, die auf der Teilnahme von Eltern-Kind-Klassen basieren.

1. Einzigartiges Erbe

Dies ist eine Form der Vererbung, bei der eine Klasse nur eine Hauptklasse erbt. Dies ist die einfache Form der Vererbung und, Daher, auch bekannt als einfache Vererbung.

Klasse Eltern:
  def f1(selbst):
    drucken("Funktion der Elternklasse.")

Klasse Kind(Elternteil):
  def f2(selbst):
    drucken("Funktion der untergeordneten Klasse.")

Objekt1 = Kind()
Objekt1.f1()
Objekt1.f2()

screenshot-from-2020-09-28-22-11-28-7257539

Hier, Die untergeordnete Klasse erbt nur eine übergeordnete Klasse, Daher, Dies ist ein Beispiel für einfache Vererbung.

2. Mehrfachvererbung

Eine Vererbung wird zu Mehrfachvererbung, wenn eine Klasse mehr als eine Hauptklasse erbt. Die untergeordnete Klasse hat nach dem Vererben von Eigenschaften von mehreren Hauptklassen Zugriff auf alle ihre Objekte.

Klasse Eltern_1:
  def f1(selbst):
    drucken("Funktion der Klasse parent_1.")

Klasse Parent_2:
  def f2(selbst):
    drucken("Funktion der Klasse parent_2.")

Klasse Parent_3:
  def f3(selbst):
    drucken("Funktion der Klasse parent_3.")

Klasse Kind(Elternteil_1, Eltern_2, Übergeordnet_3):
  def f4(selbst):
    drucken("Funktion der untergeordneten Klasse.")

Objekt_1 = Kind()
Objekt_1.f1()
Objekt_1.f2()
Objekt_1.f3()
Objekt_1.f4()

screenshot-from-2020-09-30-18-01-00-6896696

Hier haben wir eine Child-Klasse, die die Eigenschaften der drei Parent-Klassen Parent_1 . erbt, Elternteil_2 und Elternteil_3. Alle Klassen haben unterschiedliche Funktionen und alle Funktionen werden mit dem Child-Klassenobjekt aufgerufen.

Aber nehmen wir an, eine untergeordnete Klasse erbt zwei Klassen, die dieselbe Funktion haben:

Klasse Eltern_1:
  def f1(selbst):
    drucken("Funktion der Klasse parent_1.")

Klasse Parent_2:
  def f1(selbst):
    drucken("Funktion der Klasse parent_2.")

Klasse Kind(Elternteil_1, Eltern_2):
  def f2(selbst):
    drucken("Funktion der untergeordneten Klasse.")

Hier, Die Klassen Parent_1 und Parent_2 haben die gleiche Funktion f1 (). Jetzt, wenn Objekt der Klasse Child f1 . aufruft (), da die Child-Klasse die beiden Elternklassen erbt, Was sollte deiner Meinung nach passieren?

obj = Kind() 
obj.f1()

screenshot-from-2020-09-30-18-04-07-6132602

Aber, Warum wurde die f1-Funktion nicht geerbt? () aus der Klasse Parent_2?

Bei Mehrfachvererbung, die untergeordnete Klasse sucht die Methode zuerst in ihrer eigenen Klasse. Wenn nicht gefunden, suche die Elternklassen deep_first und ordne sie von links nach rechts. Da dies ein einfaches Beispiel mit nur zwei Hauptklassen war, Wir können deutlich sehen, dass die Klasse Parent_1 zuerst geerbt wurde, Daher sucht die untergeordnete Klasse nach der Methode in der Klasse Parent_1, bevor sie in der Klasse Parent_2 sucht.

Aber für komplizierte Vererbungsprobleme, es ist schwierig die reihenfolge zu identifizieren. Dann, der eigentliche Weg dazu heißt Reihenfolge von Auflösung Methode (MRO) und Python. Wir können den MRO einer beliebigen Klasse mithilfe des Attributs __mro__ ermitteln

Kind.__mro__

screenshot-from-2020-09-30-18-06-17-7768903

Dies zeigt an, dass die Child-Klasse zuerst die Parent_1-Klasse und dann Parent_2 besucht hat, also wird die f1-Methode aufgerufen () von Parent_1.

Nehmen wir ein etwas kompliziertes Beispiel in Python:

Klasse Eltern_1:
passieren

Klasse Parent_2:
passieren

Klasse Parent_3:
passieren

Klasse Kind_1(Elternteil_1, Elternteil_2):
passieren

Klasse Kind_2(Elternteil_2, Elternteil_3):
passieren

Klasse Kind_3(Kind_1, Kind_2, Elternteil_3):
passieren

Hier, Klasse Child_1 erbt zwei Klassen: Elternteil_1 und Elternteil_2. Die Klasse Child_2 erbt auch zwei Klassen: Elternteil_2 und Elternteil_3. Eine andere Child_3-Klasse erbt drei Klassen: Kind_1, Kind_2 und Eltern_3.

Jetzt, schau dir nur dieses Erbe an, es ist ziemlich schwierig, die Reihenfolge der Methodenauflösung für die Klasse Child_3 zu bestimmen. Hier ist also die tatsächliche Verwendung von __mro __-

screenshot-from-2020-09-30-18-07-32-8298006

Das können wir zuerst sehen, der Dolmetscher sucht nach Child_3, dann Child_1 gefolgt von Parent_1, Kind_2, Parent_2 bzw. Parent_3.

3. Mehrstufige Vererbung

Zum Beispiel, eine Klasse_1 wird von einer Klasse_2 ​​geerbt und diese Klasse_2 ​​wird auch von Klasse_3 geerbt und dieser Prozess wird fortgesetzt. Dies wird als mehrstufige Vererbung bezeichnet.. Lass es uns mit einem Beispiel verstehen:

Klasse Eltern:
  def f1(selbst):
    drucken("Funktion der Elternklasse.")

Klasse Kind_1(Elternteil):
  def f2(selbst):
    drucken("Funktion der Klasse child_1.")

Klasse Kind_2(Kind_1):
  def f3(selbst):
    drucken("Funktion der Klasse child_2.")

obj_1 = Kind_1()
obj_2 = Kind_2()

obj_1.f1()
obj_1.f2()

drucken("n")
obj_2.f1()
obj_2.f2()
obj_2.f3()

screenshot-from-2020-09-30-18-09-52-9849898

Hier, Klasse Child_1 erbt Klasse Parent und Klasse Child_2 erbt Klasse Child_1. In diesem Child_1 hast du Zugriff auf die Funktionen f1 () y f2 () während Child_2 Zugriff auf die Funktionen f1 . hat (), f2 () und f3 (). Wenn wir versuchen, auf die Funktion f3 . zuzugreifen () mit dem Klassenobjekt Class_1, es wird ein Fehler auftreten, der angibt:

Das Objekt ‚Kind_1‘ hat kein Attribut ‚f3‘

obj_1.f3()

screenshot-from-2020-09-30-18-11-09-7482388

4- Hierarchische Vererbung

In diesem, mehrere Child-Klassen erben eine einzelne Parent-Klasse. Das in der Einführung zur Vererbung angegebene Beispiel ist ein Beispiel für hierarchische Vererbung, da die BMW- und Audi-Klassen die Pkw-Klasse erben.

Vereinfachen, Sehen wir uns ein anderes Beispiel an:

Klasse Eltern:
deff1(selbst):
drucken("Funktion der Elternklasse.")

Klasse Kind_1(Elternteil):
deff2(selbst):
drucken("Funktion der Klasse child_1.")

Klasse Kind_2(Elternteil):
deff3(selbst):
drucken("Funktion der Klasse child_2.")

obj_1 = Kind_1()
obj_2 = Kind_2()

obj_1.f1()
obj_1.f2()

drucken('n')
obj_2.f1()
obj_2.f3()

screenshot-from-2020-09-30-18-13-09-8467252

Hier erben zwei untergeordnete Klassen dieselbe übergeordnete Klasse. Klasse Child_1 hat Zugriff auf Funktionen f1 () von der Parent-Klasse und zur f2-Funktion () Von ihrem Selbst. Während die Klasse Child_2 Zugriff auf die f1-Funktionen hat () der Parent-Klasse und der f3-Funktion () Von ihrem Selbst.

5- Hybride Vererbung

Bei einer Kombination von mehr als einer Form der Vererbung, bekannt als hybride Vererbung. Nach diesem Beispiel wird es klarer:

Klasse Eltern:
  def f1(selbst):
    drucken("Funktion der Elternklasse.")

Klasse Kind_1(Elternteil):
  def f2(selbst):
    drucken("Funktion der Klasse child_1.")

Klasse Kind_2(Elternteil):
  def f3(selbst):
    drucken("Funktion der Klasse child_2.")

Klasse Kind_3(Kind_1, Kind_2):
  def f4(selbst):
    drucken("Funktion der Klasse child_3.")

obj = Kind_3()
obj.f1()
obj.f2()
obj.f3()
obj.f4()

screenshot-from-2020-09-30-18-14-15-1161987

In diesem Beispiel, zwei Klassen ‚Child_1" und‘ Kind_2 ‚werden von der Basisklasse abgeleitet‘ Elternteil ‚Hierarchische Vererbung verwenden. Eine andere Klasse ‚Child_3‘ leitet sich ab von der ‚Kind_1‘ Ja ‚Kind_2‘ Verwendung mehrerer Vererbungen. Klasse ‚Child_3‘ jetzt über hybride Vererbung abgeleitet.

Methodenüberschreibung

Der Begriff der Annullierung ist bei der Erbschaft sehr wichtig. Verleiht dem Kind die besondere Fähigkeit / Unterklassen, um eine bestimmte Implementierung für eine Methode bereitzustellen, die bereits in ihren übergeordneten Klassen vorhanden ist.

Klasse Eltern:
  def f1(selbst):
    drucken("Funktion der Elternklasse.")

Klasse Kind(Elternteil):
  def f1(selbst):
    drucken("Funktion der Child-Klasse.")

obj = Kind()
obj.f1()

screenshot-from-2020-09-30-18-15-01-1521849

Hier, Funktion f1 () aus der Klasse Child hat die Funktion f1 . überschrieben () der Elternklasse. Immer wenn das Objekt der Child-Klasse f1 . aufruft (), die Funktion der Child-Klasse wird ausgeführt. Aber trotzdem, Hauptklassenobjekt kann Funktion f1 aufrufen () der Hauptklasse.

obj_2 = Elternteil()
obj_2.f1()

screenshot-from-2020-09-30-18-15-39-2868996

Die Superfunktion ()

Die Superfunktion () in Python gibt es ein Proxy-Objekt zurück, das auf die übergeordnete Klasse verweist, indem es die Super Stichwort. Dieses Super-Keyword () es ist grundsätzlich nützlich, um auf die überschriebenen Methoden der Hauptklasse zuzugreifen.

  1. In einer Klassenhierarchie mit einfacher Vererbung, Super hilft, Hauptklassen zu referenzieren, ohne sie explizit zu benennen, was die Wartung des Codes erleichtert.

    Zum Beispiel-

    Klasse Eltern:
      def f1(selbst):
        drucken("Funktion der Elternklasse.")
    
    Klasse Kind(Elternteil):
      def f1(selbst):
        Super().f1()
        drucken("Funktion der Child-Klasse.")
    
    obj = Kind()
    obj.f1()

    screenshot-from-2020-09-30-18-16-53-9118408

    Hier, mit hilfe von super (). F1 (), Methode f1 wurde aufgerufen () Oberklasse der Klasse Kind, nämlich, die Parent-Klasse, ohne sie explizit zu benennen.

    Zu beachten ist hier, dass die Superklasse () kann zwei Parameter: die erste ist der Name der Unterklasse und die zweite ist ein Objekt, das eine Instanz dieser Unterklasse ist. Mal sehen wie

    Klasse Eltern:
      def f1(selbst):
        drucken("Funktion der Elternklasse.")
    
    Klasse Kind(Elternteil):
      def f1(selbst):
        Super( Kind, selbst ).f1()
        drucken("Funktion der Child-Klasse.")
    
    obj = Kind()
    obj.f1()

    screenshot-from-2020-09-30-18-16-53-9118408

    Der erste Parameter bezieht sich auf die Unterklasse Kind, während sich der zweite Parameter auf das Child-Objekt bezieht, das, in diesem Fall, es ist man selbst. Sie können das Ergebnis sehen, nachdem Sie super verwendet haben () und super (Kind, selbst) ist das gleiche, weil, und Python 3, Super (Kind, selbst) ist gleichbedeutend mit selbst ().

    Schauen wir uns nun ein weiteres Beispiel mit der Funktion __init__ an.

    Klasse Eltern(Objekt):
      def__init__(selbst, Elternname):
        drucken(Elternname, 'ist von einer anderen Klasse abgeleitet.')
    
    Klasse Kind(Elternteil):
      def__init__(selbst, Kindername):
        drucken(Name,'ist eine Unterklasse.')
        Super().__drin__(Kindername)
    
    obj = Kind('Kind')
    screenshot-from-2020-09-30-18-18-16-3947931

    Was wir hier gemacht haben, ist, dass wir die Funktion __init__ der Klasse Parent aufrufen (in der Kinderklasse) mit Super () .__ drin __ (Kindername). Und da die Methode __init__ der Klasse Parent ein Argument benötigt, es ist passiert wie „Kindername“. Dann, nach dem Erstellen eines Objekts der Klasse Child, zuerst wurde die Funktion __init__ der Klasse Child ausgeführt, und dann die __init__ Funktion der Parent-Klasse.

  2. Der zweite Anwendungsfall ist die Unterstützung mehrerer kooperativer Vererbungen in einer dynamischen Laufzeitumgebung.
    Klasse zuerst():
      def __init__(selbst):
        drucken("Erste")
        Super().__drin__()
    
    Klasse Zweite():
      def __init__(selbst):
        drucken("Sekunde")
        Super().__drin__()
    
    Klasse Dritte(Sekunde, Zuerst):
      def __init__(selbst):
        drucken("Dritter")
        Super().__drin__()
    
    obj = Dritte()

    screenshot-from-2020-09-30-18-19-20-4144770
    Der Superruf () finden Sie die folgende Methode in der MRO bei jedem Schritt, Also müssen die Erste und die Zweite auch haben, andererseits, Ausführung endet am Ende von erste () .__ drin__.

    Beachten Sie, dass die erste und zweite Oberklasse Objekt.

    Finden wir das MRO von Third () auch-

    Dritte.__mro__

    screenshot-from-2020-09-30-18-19-53-1265153

    Der Auftrag ist Dritter> Sekunde> Zuerst und gleich ist die Reihenfolge unserer Abreise.

Abschließende Anmerkungen

Fertigstellen, In diesem Artikel habe ich das Konzept der Vererbung in der objektorientierten Programmierung in Python entwickelt. Ich habe verschiedene Formen der Vererbung und einige der gängigen Konzepte der Vererbung behandelt, wie Methodenüberschreibung und Superfunktion ().

Ich hoffe, Sie haben die in diesem Artikel erläuterten Konzepte verstanden. Lass es mich in den Kommentaren unten wissen, wenn du Fragen hast..

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.

Datenlautsprecher