Python3 objektorientiert

Python ist seit Beginn seiner Entwicklung eine objektorientierte Sprache. Aus diesem Grund ist es sehr einfach, in Python Klassen und Objekte zu erstellen. Dieses Kapitel führt detailliert in die objektorientierte Programmierung mit Python ein.

Wenn Sie noch nie mit objektorientierten Programmiersprachen in Berührung gekommen sind, sollten Sie zunächst einige grundlegende Merkmale objektorientierter Sprachen verstehen und in Ihrem Kopf ein grundlegendes Konzept der Objektorientierung entwickeln. Das wird Ihnen helfen, die objektorientierte Programmierung mit Python leichter zu lernen.

Betrachten wir als Nächstes kurz einige grundlegende Merkmale der Objektorientierung.


Einführung in die objektorientierte Technologie

  • Klasse:Wird verwendet, um eine Sammlung von Objekten mit denselben Attributen und Methoden zu beschreiben. Sie definiert die Attribute und Methoden, die jedem Objekt in der Sammlung gemeinsam sind. Ein Objekt ist eine Instanz einer Klasse.
  • Methode:Eine in einer Klasse definierte Funktion.
  • Klassenvariable:Eine Klassenvariable wird von allen instanziierten Objekten gemeinsam genutzt. Klassenvariablen werden in der Klasse und außerhalb jedes Funktionskörpers definiert. Klassenvariablen werden normalerweise nicht als Instanzvariablen verwendet.
  • Datenmitglieder:Klassen- oder Instanzvariablen werden verwendet, um Daten zu verarbeiten, die mit der Klasse und ihren Instanzobjekten zusammenhängen.
  • Methodenüberschreibung:Wenn eine von der Elternklasse geerbte Methode die Anforderungen der Unterklasse nicht erfüllen kann, kann sie überschrieben werden. Dieser Vorgang wird als Methodenüberschreibung bezeichnet.
  • Lokale Variable:Eine in einer Methode definierte Variable, die nur die Klasse der aktuellen Instanz beeinflusst.
  • Instanzvariable:In der Deklaration einer Klasse werden Attribute durch Variablen dargestellt. Solche Variablen werden Instanzvariablen genannt. Eine Instanzvariable ist eine mit self modifizierte Variable.
  • Vererbung:Das heißt, eine abgeleitete Klasse erbt die Felder und Methoden einer Basisklasse. Die Vererbung ermöglicht es auch, ein Objekt einer abgeleiteten Klasse als Objekt der Basisklasse zu behandeln. Zum Beispiel gibt es ein solches Design: ein Objekt vom Typ Dog, das von der Klasse Animal abgeleitet ist, was eine "is-a"-Beziehung simuliert (zum Beispiel ist Dog ein Animal).
  • Instanziierung:Erstellen einer Instanz einer Klasse, des konkreten Objekts der Klasse.
  • Objekt:Eine Instanz einer Datenstruktur, die durch eine Klasse definiert wird. Objekte enthalten zwei Datenelemente (Klassenvariablen und Instanzvariablen) und Methoden.

Im Vergleich zu anderen Programmiersprachen hat Python den Klassenmechanismus hinzugefügt, ohne nach Möglichkeit neue Syntax und Semantik hinzuzufügen.

Klassen in Python bieten alle grundlegenden Funktionen der objektorientierten Programmierung: Der Vererbungsmechanismus von Klassen erlaubt mehrere Basisklassen, abgeleitete Klassen können jede Methode in der Basisklasse überschreiben, und Methoden können Methoden mit demselben Namen in der Basisklasse aufrufen.

Objekte können eine beliebige Anzahl und Art von Daten enthalten.

Klassendefinition

Das Syntaxformat lautet wie folgt:

class ClassName: <Anweisung-1> . . . <Anweisung-N>

Nachdem eine Klasse instanziiert wurde, können ihre Attribute verwendet werden. Tatsächlich kann nach dem Erstellen einer Klasse auf ihre Attribute über den Klassennamen zugegriffen werden.

Klassenobjekte

Klassenobjekte unterstützen zwei Operationen: Attributreferenz und Instanziierung.

Attributreferenzen verwenden dieselbe Standardsyntax wie alle Attributreferenzen in Python:obj.name。

Nachdem ein Klassenobjekt erstellt wurde, sind alle Namen im Klassen-Namespace gültige Attributnamen. Wenn die Klassendefinition also so aussieht:

Beispiele (Python 3.0+)

#!/usr/bin/python3 class MyClass: """Ein einfaches Klassenbeispiel""" i = 12345 def f(self): return 'hello world' # Klasse instanziieren x = MyClass() # Zugriff auf die Attribute und Methoden der Klasse print("Das Attribut i der Klasse MyClass ist:", x.i) print("Die Methode f der Klasse MyClass gibt aus:", x.f())

Der obige Code erzeugte eine neue Klasseninstanz und wies das Objekt der lokalen Variablen x zu, wobei x ein leeres Objekt ist.

Die Ausgabe der Ausführung des obigen Programms ist:

MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

Die Klasse besitzt eine spezielle Methode namens __init__() (Konstruktormethode), die automatisch aufgerufen wird, wenn die Klasse instanziiert wird, wie folgt:

def __init__(self): self.data = []

Wenn eine Klasse die Methode __init__() definiert, ruft die Klasseninstanziierung automatisch die Methode __init__() auf. Wie unten gezeigt, wird beim Instanziieren der Klasse MyClass die entsprechende Methode __init__() aufgerufen:

x = MyClass()

Natürlich kann die Methode __init__() Parameter haben, und Parameter werden über __init__() an den Klasseninstanziierungsvorgang übergeben. Zum Beispiel:

Beispiele (Python 3.0+)

#!/usr/bin/python3 class Complex: def __init__(self, realpart, imagpart): self.r = realpart self.i = imagpart x = Complex(3.0, -4.5) print(x.r, x.i) # Ausgabeergebnis: 3.0 -4.5

self repräsentiert die Instanz der Klasse, nicht die Klasse

Der einzige besondere Unterschied zwischen Methoden einer Klasse und gewöhnlichen Funktionen besteht darin, dass sie einen zusätzlichenersten Parameternamenhaben müssen, der konventionsgemäß self genannt wird.

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

Das Ausführungsergebnis des obigen Beispiels ist:

<__main__.Test instance at 0x100771878>
__main__.Test

Aus dem Ausführungsergebnis ist deutlich zu erkennen, dass self die Instanz der Klasse repräsentiert, die Adresse des aktuellen Objekts darstellt, während self.class auf die Klasse verweist.

self ist kein Python-Schlüsselwort. Wenn wir es in example ändern, wird es trotzdem normal ausgeführt:

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

Das Ausführungsergebnis des obigen Beispiels ist:

<__main__.Test instance at 0x100771878>
__main__.Test

In Python ist self ein konventioneller Name, der verwendet wird, um die Instanz (das Objekt) einer Klasse selbst zu repräsentieren. Es ist eine Referenz auf die Instanz, die es den Methoden der Klasse ermöglicht, auf die Attribute der Instanz zuzugreifen und sie zu manipulieren.

Wenn Sie eine Klasse definieren und Methoden in der Klasse definieren, wird der erste Parameter normalerweise self genannt. Obwohl Sie andere Namen verwenden können, wird dringend empfohlen, self zu verwenden, um die Konsistenz und Lesbarkeit des Codes zu wahren.

Beispiel

class MyClass:
    def __init__(self, value):
        self.value = value

    def display_value(self):
        print(self.value)

# Eine Instanz einer Klasse erstellen
obj = MyClass(42)

# Eine Methode der Instanz aufrufen
obj.display_value() # Ausgabe 42

Im obigen Beispiel ist self eine Referenz, die auf die Klasseninstanz zeigt. Sie wird im__init__-Konstruktor verwendet, um die Attribute der Instanz zu initialisieren, und auch in dendisplay_value-Methoden, um auf die Attribute der Instanz zuzugreifen. Durch die Verwendung von self können Sie in den Methoden der Klasse auf die Attribute der Instanz zugreifen und sie manipulieren, wodurch das Verhalten der Klasse implementiert wird.


Klassenmethoden

Verwenden Sie innerhalb der Klasse dasdefSchlüsselwort, um eine Methode zu definieren. Im Gegensatz zu allgemeinen Funktionsdefinitionen müssen Klassenmethoden den Parameter self enthalten, und er muss der erste Parameter sein. self repräsentiert die Instanz der Klasse.

Beispiele (Python 3.0+)

#!/usr/bin/python3 # Klassendefinition class people: # Grundlegende Attribute definieren name = '' age = 0 # Private Attribute definieren. Auf private Attribute kann von außerhalb der Klasse nicht direkt zugegriffen werden. __weight = 0 # Die Konstruktormethode definieren def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s sagt: Ich bin %d Jahre alt." %(self.name,self.age)) # Die Klasse instanziieren p = people('example',10,30) p.speak()

Die Ausgabe der Ausführung des obigen Programms ist:

example 说: 我 10 岁。

Vererbung

Python unterstützt auch Klassenvererbung. Wenn eine Sprache keine Vererbung unterstützt, sind Klassen bedeutungslos. Die Definition einer abgeleiteten Klasse ist wie folgt:

class DerivedClassName(BaseClassName): <statement-1> . . . <Anweisung-N>

Eine Unterklasse (abgeleitete Klasse DerivedClassName) erbt die Attribute und Methoden der Elternklasse (Basisklasse BaseClassName).

BaseClassName (der Basisklassenname im Beispiel) muss sich im selben Gültigkeitsbereich wie die Definition der abgeleiteten Klasse befinden. Zusätzlich zu Klassen können auch Ausdrücke verwendet werden. Dies ist sehr nützlich, wenn die Basisklasse in einem anderen Modul definiert ist:

class DerivedClassName(modname.BaseClassName):

Beispiele (Python 3.0+)

#!/usr/bin/python3 # Klassendefinition class people: # Grundlegende Attribute definieren name = '' age = 0 # Private Attribute definieren. Auf private Attribute kann von außerhalb der Klasse nicht direkt zugegriffen werden. __weight = 0 # Die Konstruktormethode definieren def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s sagt: Ich bin %d Jahre alt." %(self.name,self.age)) # Beispiel für Einfachvererbung class student(people): grade = '' def __init__(self,n,a,w,g): # Konstruktor der Elternklasse aufrufen people.__init__(self,n,a,w) self.grade = g # Methode der Elternklasse überschreiben def speak(self): print("%s sagt: Ich bin %d Jahre alt und ich bin in Klasse %d"%(self.name,self.age,self.grade)) s = student('ken',10,60,3) s.speak()

Die Ausgabe der Ausführung des obigen Programms ist:

ken 说: 我 10 岁了,我在读 3 年级

Mehrfachvererbung

Python bietet außerdem eingeschränkte Unterstützung für Mehrfachvererbung. Die Klassendefinition für Mehrfachvererbung sieht wie folgt aus:

class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N>

Beachten Sie die Reihenfolge der Elternklassen in Klammern. Wenn die Elternklassen eine Methode mit demselben Namen haben und die Unterklasse beim Verwenden nicht angibt, welche, sucht Python von links nach rechts. Das heißt, wenn die Methode in der Unterklasse nicht gefunden wird, werden die Elternklassen von links nach rechts geprüft, ob sie die Methode enthalten.

Beispiele (Python 3.0+)

#!/usr/bin/python3 # Klassendefinition class people: # Grundlegende Attribute definieren name = '' age = 0 # Private Attribute definieren; auf private Attribute kann von außerhalb der Klasse nicht direkt zugegriffen werden __weight = 0 # Die Konstruktormethode definieren def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s sagt: Ich bin %d Jahre alt." %(self.name,self.age)) # Beispiel für Einfachvererbung class student(people): grade = '' def __init__(self,n,a,w,g): # Konstruktor der Elternklasse aufrufen people.__init__(self,n,a,w) self.grade = g # Methode der Elternklasse überschreiben def speak(self): print("%s sagt: Ich bin %d Jahre alt und ich bin in Klasse %d"%(self.name,self.age,self.grade)) # Eine weitere Klasse, Vorbereitung vor Mehrfachvererbung class speaker(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speak(self): print("Mein Name ist %s, ich bin ein Redner, und mein Vortragsthema ist %s"%(self.name,self.topic)) # Mehrfachvererbung class sample(speaker,student): a ='' def __init__(self,n,a,w,g,t): student.__init__(self,n,a,w,g) speaker.__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak() # Wenn Methodennamen gleich sind, wird standardmäßig die Methode der Elternklasse aufgerufen, die in den Klammern weiter vorn steht

Die Ausgabe des obigen Programms ist:

我叫 Tim,我是一个演说家,我演讲的主题是 Python

Methodenüberschreibung

Wenn eine Methode der Elternklasse Ihre Anforderungen nicht erfüllen kann, können Sie die Methode der Elternklasse in der Unterklasse überschreiben. Beispiel:

Beispiele (Python 3.0+)

#!/usr/bin/python3 class Parent: # Die Elternklasse definieren def myMethod(self): print ('Aufruf der Methode der Elternklasse') class Child(Parent): # Die Unterklasse definieren def myMethod(self): print ('Aufruf der Methode der Unterklasse') c = Child() # Unterklasseninstanz c.myMethod() # Die Unterklasse ruft die überschriebene Methode auf super(Child,c).myMethod() # Mit einem Unterklassenobjekt die überschriebene Methode der Elternklasse aufrufen

super()-Funktionwird verwendet, um eine Methode der Elternklasse (Oberklasse) aufzurufen.

Die Ausgabe des obigen Programms ist:

Call subclass method
Call superclass method

Weitere Dokumentation:

Erklärung, wie eine Python-Unterklasse den Konstruktor der Elternklasse erbt


Klassenattribute und Methoden

Private Attribute einer Klasse

__private_attrs: Beginnt mit zwei Unterstrichen und deklariert das Attribut als privat. Es kann außerhalb der Klasse nicht verwendet oder direkt darauf zugegriffen werden. Bei Verwendung in Methoden innerhalb der Klasse...self.__private_attrs。

Klassenmethoden

Verwenden Sie innerhalb einer Klasse das Schlüsselwort def, um eine Methode zu definieren. Anders als bei gewöhnlichen Funktionsdefinitionen muss eine Klassenmethode einen Parameterselfenthalten, und er muss der erste Parameter sein, wobeiselfdie Instanz der Klasse repräsentiert.

selfDer Name ist nicht festgelegt; Sie können auchthisverwenden, aber es ist am besten, der Konvention zu folgen.self。

Private Methoden einer Klasse

__private_method: Beginnt mit zwei Unterstrichen und deklariert die Methode als private Methode. Sie kann nur innerhalb der Klasse aufgerufen werden, nicht außerhalb der Klasse.self.__private_methods。

Beispiel

Das Folgende ist ein Beispiel für private Attribute einer Klasse:

Beispiele (Python 3.0+)

#!/usr/bin/python3 class JustCounter: __secretCount = 0 # Private Variable publicCount = 0 # Öffentliche Variable def count(self): self.__secretCount += 1 self.publicCount += 1 print (self.__secretCount) counter = JustCounter() counter.count() counter.count() print (counter.publicCount) print (counter.__secretCount) # Fehler: Die Instanz kann nicht auf die private Variable zugreifen

Die Ausgabe des obigen Programms ist:

1
2
2
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print (counter.__secretCount)  # 报错,实例不能访问私有变量
AttributeError: 'JustCounter' object has no attribute '__secretCount'

Das Folgende ist ein Beispiel für private Methoden einer Klasse:

Beispiele (Python 3.0+)

#!/usr/bin/python3 class Site: def __init__(self, name, url): self.name = name # öffentlich self.__url = url # privat def who(self): print('name : ', self.name) print('url : ', self.__url) def __foo(self): # Private Methode print('Dies ist eine private Methode') def foo(self): # Öffentliche Methode print('Dies ist eine öffentliche Methode') self.__foo() x = Site('Beispiel', 'www.example.com') x.who() # Normale Ausgabe x.foo() # Normale Ausgabe x.__foo() # Fehler

Das Ausführungsergebnis des obigen Beispiels:

Spezielle Methoden einer Klasse:

  • __init__ :Konstruktor, wird aufgerufen, wenn ein Objekt erstellt wird
  • __del__ :Destruktor, wird verwendet, wenn ein Objekt freigegeben wird
  • __repr__ :Ausgabe, Konvertierung
  • __setitem__ :Zuweisung per Index
  • __getitem__:Wert per Index abrufen
  • __len__:Länge abrufen
  • __cmp__:Vergleichsoperation
  • __call__:Funktionsaufruf
  • __add__:Additionsoperation
  • __sub__:Subtraktionsoperation
  • __mul__:Multiplikationsoperation
  • __truediv__:Divisionsoperation
  • __mod__:Modulooperation
  • __pow__:Potenz

Operatorüberladung

Python unterstützt auch Operatorüberladung. Wir können die speziellen Methoden einer Klasse überladen. Beispiel:

Beispiele (Python 3.0+)

#!/usr/bin/python3 class Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d)' % (self.a, self.b) def __add__(self,other): return Vector(self.a + other.a, self.b + other.b) v1 = Vector(2,10) v2 = Vector(5,-2) print (v1 + v2)

Das Ausführungsergebnis des obigen Codes ist wie folgt:

Vector(7,8)
Weitere Erweiterungen