Vererbung und Polymorphismus in Python

1- Die Vorstellung

Das Inherit und die Polymorphie - Das sind die sehr wichtige Definition im Python, die Sie kennen müssen.
Vor dem Lernen "Vererbung und Polymorphismus in Python" stellen Sie sicher dass Sie "Die Klasse und das Objekt" kenen. Wenn nicht, lernen Sie sie:
Das Dokument wird nach der Quelle  von ... geschrieben:
  • Python 3.x

2- Die Inheritance im Python

Python genehmigt Ihnen, eine ausgeweiterte Klasse aus einer oder vieler Klasse zu erstellen. Die Klasse wird derived class genannt, oder einfach die untergeordneten genannt.

Die untergeordneten Klasse erbt die Attribute, die Methode und die anderen Mitglieder aus der Vaterklasse. Sie können  auf die Methode aus der Vaterklasse überschreiben (override). Wenn die untergeordnete Klasse seinen Constructor nichst selbst definieren kann, erbt sie standardmäßig den Constructor von ihrer Vaterklasse.
Änders als  Java, CSharp und einige Sprache genehmigt Python die Multi-Inherit. Eine Klasse kann aus einer oder vieler Vaterklasse ausgeweitert werden.
Wir brauchen einige Klasse zur Teilnahme an dem Beispiel.
  • Animal: Die Klasse bezeichnet eine Klasse Animal (Tier).
  • Duck: Die Klasse bezeichnet die Klasse Ente ,eine untergeordnete Klasse von Animal.
  • Cat: Die Klasse bezeichnet die Klasse Katze, eine untergeordnete Klasse von Animal
  • MouseDie Klasse bezeichnet die Klasse Maus. eine untergeordnete Klasse von Animal.
Im  Python ist der COnstructor benutzt, ein Objetk zu erstellen und die Wert für die Attribute zuzuweisen.
Der Constructor der untergeordneten Klasse ruft immer auf den Constructor der Vaterklasse auf, um die Wert für die Attribute der Vaterklasse zuzuweisen, dann die Wert für ihre Attribute zuzuweisen
Gucken Sie das Beispiel
animal.py
class Animal :  

    # Constructor
    def __init__(self, name):
        
        # Die Klasse Animal hat eine Attribute  'name'.
        self.name= name 
    
    # Die Methode (method):
    def showInfo(self):
        print ("I'm " + self.name)
        
    # Die Methode (method):
    def move(self):
        print ("moving ...")
Cat ist die untergeordnete Inheritsklasse von der Klasse  Animal,. Sie hat auch ihre Attribute
cat.py
from animal import Animal      
        
# Die Klasse Cat verlängert (extends) aus der Klasse Animal.
class Cat (Animal):
    
    def __init__(self, name, age, height):
        # Die Aufruf auf Constructor der Vaterklasse (Animal) um die Wert in die Attribute 'name' der Vaterklasse anzuweisen.
        super().__init__(name)
        
        self.age = age
        self.height = height
    
    # Die Methode mit dem gleichen Name der Vaterklasse überschreiben (override)
    def showInfo(self):
        
        print ("I'm " + self.name)
        print (" age " + str(self.age))
        print (" height " + str(self.height))
catTest.py
from cat import Cat


tom = Cat("Tom", 3, 20)

print ("Call move() method")

tom.move()

print ("\n")
print ("Call showInfo() method")

tom.showInfo()
Das Ergebnis der Duchführung von Module catTest:
Was passiert wenn Sie ein Objekt durch den Constructor erstellen? Wie ruft es auf den Constructor der Vaterklasse auf ? Sehen Sie bitte das folgende Beispiel:
Im oben Beispielbild sehen Sie, der Constructor der Vaterklasse wird auf den Constructor der untergeordneten Klasse geruft. Er weist die Wert für die Attribute der Vaterklasse zu und dann die Attribute der untergeordnete wird die Wert zugewiesen.

3- Die Methode überschreiben

Standardmäßig wird die untergeordneten Klasse die Methode aus der Vaterklass geerbt, Allerdings kann die untergeordneten Klasse auf die Methode der Vaterklasse überschreiben (override)
.
mouse.py
from animal import Animal      
        
# Die Klasse Mouse verlängert (extends) aus der Klasse Animal.
class Mouse (Animal):
    
    def __init__(self, name, age, height):
        # Die Aufruf auf Constructor der Vaterklasse (Animal) um die Wert in die Attribute der Vaterklasse anzuweisen.
        super().__init__(name)
        
        self.age = age
        self.height = height
    
    # Die Methode mit dem gleichen Name der Vaterklasse überschreiben (override).
    def showInfo(self):
        # Die Aufruf auf die Methode der Vaterklasse.
        super().showInfo()
        print (" age " + str(self.age))
        print (" height " + str(self.height))
    
    # Die Methode mit dem gleichen Name der Vaterklasse überschreiben (override).  
    def move(self):
        print ("Mouse moving ...")
Test
mouseTest.py
from mouse import Mouse


jerry = Mouse("Jerry", 3, 5)

print ("Call move() method")

jerry.move()

print ("\n")
print ("Call showInfo() method")

jerry.showInfo()

4- Die abstrakte Methode

Es gibt die Definition über eine abstraktet Methode oder eine abstrakte Klasse in der Sprache wie  Java, C#. Aber es ist nicht klar im  Python. Aber wir kann sie definieren
Eine abstrakte Klasse definiert die abstrakte Methode und die untergeordneten Klasse müssen diese Methode zur Benutzung überschreiben (override). Die abstrakten Methode werfen immer die Ausnahme  NotImplementedError.
abstractExample.py
# Eine abstrakte Klasse (Abstract class).
class AbstractDocument :
    
    def __init__(self, name):
        
        self.name = name
        
    # Eine Methode kann nicht benutzt werden denn sie einen Fehler immer wirf.
    def show(self):
        raise NotImplementedError("Subclass must implement abstract method")    
    
    

class PDF(AbstractDocument):
    
    # Die Methode der Vaterklasse überschreiben
    def show(self):
        print ("Show PDF document:", self.name)
        
        
class Word(AbstractDocument):     
    
    def show(self):
        print ("Show Word document:", self.name)

# ----------------------------------------------------------
documents = [ PDF("Python tutorial"),
              Word("Java IO Tutorial"),
              PDF("Python Date & Time Tutorial") ]     


for doc in documents :
    
    doc.show()
Das oben Beispiel beschreibt die Polymorphie (Polymorphism) im  Python. Ein Objekt  Document (dokument) kann in vielen Formen ( PDF, Word, Excel, ...) bezeichnet werden.
Ein andere Beispeil über die Polymorphie: Wenn ich eine asiatische Person erwähne, ist das sehr abstrakt, das kann ein Japaner , ein Vietnameser oder ein Inder sein, ... Aber sie haben die typischen Merkmale der Asiate

5- Die Multi-Inheritance

Python genehmigt die Multi-Inherit, d.h Sie können eine erstreckten Klasse (extends) aus 2 oder vielen anderen Klasse erstellen. Die Vaterklasse können die gleichen Attribute oder die gleichen Methode haben... Die untergeordneten Klasse erben prioritär die Attribute, die Methode ... der ersten Klasse in der Inheritsliste
multipleInheritanceExample.py
class Horse:
    
    maxHeight = 200; # centimeter
    
    def __init__(self, name, horsehair):
        self.name = name
        self.horsehair = horsehair
    
    def run(self):
        print ("Horse run")   
     
    def showName(self):
        print ("Name: (House's method): ", self.name)   
        
    def showInfo(self):
        print ("Horse Info")    
 

class Donkey:
    
    def __init__(self, name, weight):        
        self.name = name
        self.weight = weight    
        
        
    def run(self):
        print ("Donkey run")     
        
    def showName(self):        
        print ("Name: (Donkey's method): ", self.name)   

    def showInfo(self):
        print ("Donkey Info")               
  
# Die Klasse Mule erbt aus der Horse und Donkey.
class Mule(Horse, Donkey):
    
    def __init__(self, name, hair, weight): 
        Horse.__init__(self, name, hair)  
        Donkey.__init__(self, name, weight)
        
    
    def run(self):   
        print ("Mule run")      


    def showInfo(self):
        print ("-- Call Mule.showInfo: --")
        Horse.showInfo(self)
        Donkey.showInfo(self)

# ---- Test ------------------------------------
# Die Variable 'maxHeight' wird aus der Klasse Horse geerbt
print ("Max height ", Mule.maxHeight)

mule = Mule("Mule", 20, 1000)

mule.run()

mule.showName() 

mule.showInfo()

Die Methode mro()

Die Methode  mro() hilft Ihnen bei dem Ansehen der Liste der Vaterklasse einer Klasse. Sehen Sie ein folgendes Beispiel:
mroExample.py
class X: pass
class Y: pass
class Z: pass

class A(X,Y): pass
class B(Y,Z): pass

class M(B,A,Z): pass

# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]

print(M.mro())
Beachten Sie: Im  Python ist der Befehl  pass (pass statement) wie einen Befehl  null (oder leer). Er macht nichts wenn die Klasse oder die Methode keine Inhalt hat, sollen Sie mindesten einen Befehl brauchen. Benutzen Sie pass.

6- Die Funktion von issubclass und isinstance

Python hat 2 nutzliche Funktion
  • isinstance
  • issubclass
     

isinstance

Die Funktion  isinstance hilf Ihnen zu prüfen, ob "etwas" die Objekt einer Klasse ist oder nicht.

issubclass

Die Funktion  issubclass prüft, ob die Klasse die Tochter einer anderen Klasse ist oder nicht.
isinstancesubclass.py
class A: pass
class B(A): pass


# True
print ("isinstance('abc', object): ",isinstance('abc', object)) 

# True
print ("isinstance(123, object): ",isinstance(123, object))


b = B()
a = A()

# True
print ("isinstance(b, A): ", isinstance(b, A) )
print ("isinstance(b, B): ", isinstance(b, B) )

# False
print ("isinstance(a, B): ", isinstance(a, B) )


# B is subclass of A? ==> True
print ("issubclass(B, A): ", issubclass(B, A) )

# A is subclass of B? ==> False
print ("issubclass(A, B): ", issubclass(A, B) )

7- Polymorphism mit der Funktion

Hier erstelle ich 2 Klasse  English und  French. Diese Klasse haben 2 Methode greeting(). Die beide erstellen die unterschiedlichen Begrüßungswörte. Erstellung der 2 Objekten, die der 2 oben Klasse entsprechen und die Aufruf der Aktion von 2 Objekte in einer gleichen Funktion (die Funktion  intro)
people.py

class English:
   
    def greeting(self):       
        print ("Hello")
       
       
class French:
   
    def greeting(self):
        print ("Bonjour")
 
 
def intro(language):               
   
    language.greeting()
   
   
flora  = English()
aalase = French()   


intro(flora)
intro(aalase)
Das Beispiel durchführen:

View more categories: