codestory

Vererbung und Polymorphismus in Python

  1. Die Vorstellung
  2. Die Inheritance im Python
  3. Die Methode überschreiben
  4. Die abstrakte Methode
  5. Die Multi-Inheritance
  6. Die Funktion von issubclass und isinstance
  7. Polymorphism mit der Funktion

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
  • Mouse: Die 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:
Call move() method
moving ...

Call showInfo() method
I'm Tom
 age 3
 height 20
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()
Output:
Call move() method
Mouse moving ...

Call showInfo() method
I'm Jerry
 age 3
 height 5

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()
Output:
Show PDF document: Python tutorial
Show Word document: Java IO Tutorial
Show PDF document: Python Date & Time Tutorial
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()
Output:
Max height  200
Mule run
Name: (House's method): Mule
-- Call Mule.showInfo: --
Horse Info
Donkey Info
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) )
Output:
isinstance('abc', object): True
isinstance(123, object): True
b = B()
a = A()
isinstance(b, A): True
isinstance(b, B): True
isinstance(a, B): False
isinstance(B, A): True
isinstance(A, B): False

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:
Hello
Bonjour