Klassen und Objekte

PythonBeginner
Jetzt üben

Einführung

In diesem Lab werden Sie sich mit Klassen und Objekten in Python vertraut machen. Eine Klasse ist eine Vorlage zur Erstellung von Objekten. Ein Objekt ist eine Instanz einer Klasse.

Ziele

  • Namen und Objekte
  • Gültigkeitsbereiche und Namensräume
  • Instanzobjekte
  • Methodenobjekte
  • Vererbung
  • Private Variablen

Definieren und Erstellen einer Klasse

Um eine Klasse in Python zu definieren, verwenden Sie das Schlüsselwort class gefolgt vom Namen der Klasse.

Die Klassendefinition sollte eine __init__-Methode enthalten, die in Python eine spezielle Methode ist, die aufgerufen wird, wenn ein Objekt aus der Klasse erstellt wird.

Öffnen Sie einen neuen Python-Interpreter.

python3

Hier ist ein Beispiel für eine Klasse, die einen Kreis repräsentiert:

class Circle:
    def __init__(self, radius):
        self.radius = radius

Die __init__-Methode nimmt einen Parameter radius entgegen und weist ihn dem radius-Attribut des Objekts zu.

Instanzieren eines Instanzobjekts

Um ein Instanzobjekt aus einer Klasse zu erstellen, müssen Sie den Klassennamen gefolgt von Klammern aufrufen. Es wird "Instanz" genannt, weil es ein spezifisches Vorkommen der Klasse ist.

circle1 = Circle(5)

Dies erstellt ein Instanzobjekt circle1 vom Typ Circle mit einem Radius von 5. Instanzobjekte können verwendet werden, um datenspezifisch für das Objekt zu speichern. Beispielsweise kann jeder Circle-Objekt einen anderen Radius haben.

Die __init__-Methode aus dem vorherigen Schritt wird automatisch aufgerufen, wenn das Objekt erstellt wird, und das radius-Attribut des Objekts wird mit dem Wert 5 initialisiert.

Die __init__-Methode wird oft verwendet, um den Anfangszustand eines Objekts einzurichten, wie z.B. die Attribute des Objekts zu initialisieren oder Verbindungen zu externen Ressourcen herzustellen. Sie wird automatisch aufgerufen, wenn das Objekt erstellt wird, daher müssen Sie sie nicht selbst aufrufen.

Es ist wichtig zu beachten, dass die __init__-Methode nur eine normale Methode ist und beliebigen Namen haben kann. Allerdings ist es die empfohlene Benennungskonvention, __init__ zu verwenden, um deutlich zu machen, dass es sich um die Initialisierungsmethode der Klasse handelt.

Zugreifen auf und Ändern von Attributen

Um auf die Attribute eines Objekts zuzugreifen, verwenden Sie die Punktnotation. Beispielsweise können Sie auf den Radius des circle1-Objekts zugreifen, indem Sie den folgenden Code verwenden:

print(circle1.radius) ## Output: 5

Sie können die Attribute eines Objekts ändern, indem Sie ihnen einen neuen Wert zuweisen. Beispielsweise können Sie den Radius des circle1-Objekts ändern, indem Sie den folgenden Code verwenden:

circle1.radius = 10
print(circle1.radius) ## Output: 10

Hinzufügen von Methodenobjekten

Eine Methode ist eine Funktion, die innerhalb einer Klasse definiert wird und zur Ausführung von Operationen auf den in den Attributen eines Objekts gespeicherten Daten verwendet wird. In Python werden Methoden mit dem Schlüsselwort def definiert, gefolgt vom Methodennamen und einer Parameterliste.

Hier ist ein Beispiel für eine Methode area, die in der Circle-Klasse definiert ist:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

Die Methode area berechnet die Fläche eines Kreises basierend auf seinem Radius. Sie tut dies, indem sie das self.radius-Attribut verwendet, das sich auf den Radius des Objekts bezieht, auf dem die Methode aufgerufen wird.

Um eine Methode auf einem Objekt aufzurufen, verwenden Sie die Punktnotation, gefolgt vom Methodennamen und Klammern. Beispielsweise können Sie die Methode area auf dem circle1-Objekt aufrufen, indem Sie den folgenden Code verwenden:

circle1 = Circle(15)
print(circle1.area()) ## Output: 706.5

Dies wird die Fläche des circle1-Objekts ausgeben, das eine spezifische Instanz der Circle-Klasse ist.

Methoden sind nützlich, um Funktionalität innerhalb einer Klasse zu kapseln und eine Möglichkeit bereitzustellen, auf die in den Attributen des Objekts gespeicherten Daten zu operieren.

Einsteiger sollten besonders auf die Verwendung von Klammern achten. Die Klammern werden verwendet, um die Methode auf dem Objekt aufzurufen, und die Klammern werden auch verwendet, um die Parameter an die Methode zu übergeben. Dies kann zunächst verwirrend sein, wird aber mit der fortschreitenden Auseinandersetzung mit Klassen und Objekten deutlicher werden.

Instanzobjekte und Methodenobjekte sind die beiden Haupttypen von Objekten in Python. Zusammenfassend lässt sich sagen, dass Instanzobjekte aus einer Klasse erstellt werden und Methodenobjekte innerhalb einer Klasse definiert werden.

Vererbung

Vererbung ist eine Möglichkeit, eine neue Klasse zu erstellen, die eine modifizierte Version einer bestehenden Klasse ist. Die neue Klasse wird Unterklasse (Subclass) genannt, und die bestehende Klasse ist die Oberklasse (Superclass).

Vererbung ermöglicht es Ihnen, eine Unterklasse zu erstellen, die alle Attribute und Methoden der Oberklasse hat. Darüber hinaus können Sie zusätzliche Attribute und Methoden zur Unterklasse hinzufügen oder die Attribute und Methoden der Oberklasse überschreiben.

Hier ist ein Beispiel für eine Unterklasse Cylinder, die von der Circle-Klasse erbt:

class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height

Die Cylinder-Klasse hat eine __init__-Methode, die zwei Parameter akzeptiert: radius und height. Sie ruft die __init__-Methode der Circle-Klasse mithilfe der super()-Funktion auf, um das radius-Attribut des Objekts zu initialisieren, und setzt dann das height-Attribut des Objekts.

Die super()-Funktion ist eine spezielle Funktion in Python, die sich auf die Oberklasse einer Klasse bezieht. Sie wird verwendet, um Methoden der Oberklasse von innerhalb der Unterklasse aufzurufen.

Die super()-Funktion wird in der Klassendefinition definiert und nimmt den self-Parameter entgegen, der sich auf das zu erstellende Objekt bezieht. Je nach aufgerufener Methode kann sie auch zusätzliche Parameter akzeptieren. In diesem Beispiel übergibt sie den radius-Parameter an die __init__-Methode der Circle-Klasse und initialisiert das radius-Attribut des Objekts.

Die Cylinder-Klasse hat jetzt alle Attribute und Methoden der Circle-Klasse sowie das zusätzliche height-Attribut. Sie können auf die Attribute und Methoden der Cylinder-Klasse wie bei der Circle-Klasse über die Punktnotation zugreifen.

Beispielsweise können Sie ein Cylinder-Objekt erstellen und auf seine Attribute wie folgt zugreifen:

cylinder1 = Cylinder(5, 10)
print(cylinder1.radius)  ## gibt 5 aus
print(cylinder1.height)  ## gibt 10 aus

Vererbung ist ein nützliches Merkmal in der objektorientierten Programmierung, da es Ihnen ermöglicht, Code wiederzuverwenden und eine Hierarchie von Klassen zu erstellen.

Die super()-Funktion

Die super()-Funktion ist nützlich, wenn Sie den Code der Oberklasse (Superclass) in der Unterklasse (Subclass) wiederverwenden und ihn um zusätzliche Funktionalität erweitern möchten.

Es ist wichtig zu beachten, dass die super()-Funktion keine statische Referenz auf die Oberklasse ist. Sie ist eine dynamische Referenz, die sich je nach Klasse, in der sie aufgerufen wird, ändert. Dies ermöglicht es Ihnen, Vererbung in mehreren Ebenen der Vererbung zu verwenden und auf die richtige Oberklasse auf jeder Ebene zuzugreifen.

Beispielsweise betrachten Sie die folgenden Klassen:

class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        super().method()
        print("B method")

class C(B):
    def method(self):
        super().method()
        print("C method")

Hier ist C eine Unterklasse von B, die wiederum eine Unterklasse von A ist. Wenn Sie die method-Methode auf einem C-Objekt aufrufen, wird zunächst die method-Methode der A-Klasse mithilfe der super()-Funktion aufgerufen, dann die method-Methode der B-Klasse mithilfe der super()-Funktion und schließlich die method-Methode der C-Klasse.

obj = C()
obj.method()  ## gibt "A method", "B method", "C method" aus

Die super()-Funktion ist ein nützliches Merkmal in der objektorientierten Programmierung, das es Ihnen ermöglicht, Code wiederzuverwenden und eine Hierarchie von Klassen zu erstellen.

Private Variablen

In Python sind private Variablen Variablen, die nur innerhalb der Klasse, in der sie definiert werden, verwendet werden sollen und nicht von externem Code. Private Variablen sind nicht direkt von außerhalb der Klasse zugänglich.

Um eine private Variable in der Circle-Klasse zu definieren, können Sie das doppelte Unterstrich-Präfix (__) gefolgt vom Variablennamen verwenden. Beispielsweise:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

Dies definiert eine private Variable __radius in der Circle-Klasse.

Private Variablen sollen nur innerhalb der Klasse, in der sie definiert werden, verwendet werden. Sie sind nicht direkt von außerhalb der Klasse zugänglich. Beispielsweise erhalten Sie einen Fehler, wenn Sie versuchen, auf die __radius-Variable von außerhalb der Circle-Klasse zuzugreifen:

circle1 = Circle(5)
print(circle1.__radius)  ## Dies löst einen AttributeError aus

Private Variablen sind nützlich, um Daten innerhalb einer Klasse zu kapseln und die Fähigkeit von externem Code, diese zu ändern, einzuschränken. Es ist jedoch wichtig zu beachten, dass private Variablen in Python nicht wirklich privat sind und immer noch von außerhalb der Klasse mithilfe von "Name Mangling" (Namensverfälschung) zugegriffen werden können.

Name Mangling ist eine Technik, bei der ein spezielles Präfix an den Variablennamen angefügt wird, um den Zugriff von außerhalb der Klasse schwieriger zu machen.

Beispielsweise kann die __radius-Variable immer noch von außerhalb der Circle-Klasse mit der folgenden Syntax zugegriffen werden:

print(circle1._Circle__radius)  ## Dies gibt 5 aus

Dies wird jedoch nicht als gute Programmierpraxis angesehen und sollte vermieden werden.

Stattdessen sollten Sie private Variablen nur innerhalb der Klasse, in der sie definiert werden, verwenden und, wenn erforderlich, öffentliche Methoden bereitstellen, um auf die Daten zuzugreifen oder sie zu ändern.

Hier ist ein Beispiel für eine Circle-Klasse mit einer privaten __radius-Variable und öffentlichen Methoden, um auf den Radius zuzugreifen und ihn zu ändern:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

    def get_radius(self):
        return self.__radius

    def set_radius(self, radius):
        self.__radius = radius

Um auf den Radius eines Circle-Objekts zuzugreifen, können Sie die get_radius-Methode verwenden:

circle1 = Circle(5)
print(circle1.get_radius())  ## gibt 5 aus

Um den Radius eines Circle-Objekts zu ändern, können Sie die set_radius-Methode verwenden:

circle1.set_radius(10)
print(circle1.get_radius())  ## gibt 10 aus

Zusammenfassung

In diesem Lab haben Sie sich mit Klassen und Objekten in Python vertraut gemacht. Sie haben gelernt, wie Sie eine Klasse definieren, ein Objekt aus einer Klasse erstellen, auf Attribute und Methoden eines Objekts zugreifen, Attribute eines Objekts ändern und eine Unterklasse (Subclass) erstellen, die von einer Oberklasse (Superclass) erbt.

Hier ist eine Zusammenfassung der Hauptkonzepte, die in diesem Lab behandelt wurden:

  • Eine Klasse ist eine Vorlage für die Erstellung von Objekten. Ein Objekt ist eine Instanz einer Klasse.
  • Die __init__-Methode wird aufgerufen, wenn ein Objekt aus einer Klasse erstellt wird. Sie ermöglicht es Ihnen, die Attribute des Objekts festzulegen.
  • Sie können auf die Attribute eines Objekts über die Punktnotation zugreifen und die Methoden eines Objekts aufrufen, indem Sie die Punktnotation folgen lassen von dem Methodennamen und Klammern.
  • Sie können die Attribute eines Objekts ändern, indem Sie ihnen einen neuen Wert zuweisen.
  • Vererbung ermöglicht es Ihnen, eine Unterklasse zu erstellen, die eine modifizierte Version einer Oberklasse ist. Die Unterklasse kann die Methoden der Oberklasse überschreiben oder erweitern.

Ich hoffe, dass Ihnen dieses Lab geholfen hat, sich mit Python-Klassen und -Objekten vertraut zu machen. Teilen Sie mir gerne mit, wenn Sie Fragen haben!