Objekte und Klassen

Was sind Klassen und Objekte in Python?

Python ist eine objektorientierte Programmiersprache. Im Gegensatz zur prozedurorientierten Programmierung, bei der der Schwerpunkt auf Funktionen liegt, beansprucht die objektorientierte Programmierung die Objekte.

Ein Objekt ist einfach eine Sammlung von Daten (Variablen) und Methoden (Funktionen), die auf diese Daten wirken. Und eine Klasse ist ein Entwurf für das Objekt.

Zu Beginn sind die Unterschiede zwischen Klassen und Objekten vielleicht nicht ganz klar. Die folgenden Merkpunkte können einem beim Weiterlesen in diesem Kapitel helfen, die beiden Begriffe Klasse und Objekt voneinander zu unterscheiden.

  • Eine Klasse ist eine Konstruktionsvorlage für Objekte, d.h. es ist wie eine Art Bauplan.
  • Ein Objekt hingegen ist eine konkrete Umsetzung eines solchen Bauplans.

Wir können uns die Klasse als einen Prototyp eines Autos vorstellen.

Da viele Autos aus einer Beschreibung erstellt werden können, können wir aus einer Klasse viele Objekte erstellen. Ein Objekt wird auch als Instanz einer Klasse bezeichnet, und das Erstellen dieses Objekts wird als Instantiierung bezeichnet.

Definieren einer Klasse in Python

#/usr/bin/python
class Auto():
     pass

So wie Funktionsdefinitionen mit dem Schlüsselwort def beginnen, definieren wir in Python eine Klasse mit dem Schlüsselwort class.

Dem Schlüsselwort class folgt der Name der Klasse. Nach dem Klassennamen folgt im Fall, dass die Klasse von keiner anderen Klasse abgeleitet wird der Doppelpunkt. Alle folgenden Anweisungen, die den Rumpf der Klassendefinition bilden, müssen wie in Python üblich eingerückt werden. Die Definition einer Klasse kann jedoch nicht nur aus der Kopfzeile bestehen (Syntaxfehler). Während des Entwicklungsprozess kann es vorkommen, dass man zunächst nur den Kopf einer Klasse definieren möchte, die Definition des Klassenrumpfs jedoch erst später schreiben möchte. Um in diesem Fall einen Syntaxfehler zu vermeiden, ist in Python das Schlüsselwort pass vorgesehen. Dieses Schlüsselwort kann überall dort eingefügt werden wo vorübergehend noch kein Anweisungsblock geschrieben werden soll, ein solcher aber für die syntaktische Korrektheit notwendig wäre.

Folgender Programmcode erzeugt also keinen Syntaxfehler:

class meineKlasse:
        pass

Das Schlüsselwort pass kann auch als vorübergehender Rumpf einer Funktionsdefinition oder als vorübergehender Rumpf einer Kontrollstruktur (z.B. if-then-else Anweisung) benutzt werden.

Eine Klasse erstellt einen neuen lokalen Namespace, in dem alle Attribute definiert sind. Attribute können Daten oder Funktionen sein.

Hier ist eine einfache Klassendefinition.

Objekte erstellen

class auto:
     pass
auto1=auto()
auto2=auto()
auto1.hersteller="BMW"
auto2.hersteller="Audi"
auto1.treibstoff="Benzin"
auto2.treibstoff="Diesel"
print (auto1.hersteller, auto1.treibstoff)

Eigenschaften werden in der objektorientierten Programmierung als Attribute bezeichnet. Es gibt auch spezielle Attribute, die mit doppelten Unterstrichen (__) beginnen. Zum Beispiel gibt uns __doc__ den Docstring dieser Klasse.

Attribute eines Objekts werden mittels self.attributname = wert festgelegt; dies erfolgt üblicherweise bereits bei der Initialisierung. Anschließend kann auf die so definierten Attribute innerhalb der Klasse mittels self.attributname und außerhalb mittels instanzname.attributname zugegriffen werden.

Eine Referenz ist ein Verweis auf ein Objekt. Eine Referenz ist damit ein Aliasname für ein bereits bestehendes Objekt.

Sobald wir eine Klasse definieren, wird ein neues Klassenobjekt mit demselben Namen erstellt. Mit diesem Klassenobjekt können wir auf die verschiedenen Attribute zugreifen und neue Objekte dieser Klasse instanziieren.

Es kann auch verwendet werden, um neue Objektinstanzen (Instantiierung) dieser Klasse zu erstellen. Die Prozedur zum Erstellen eines Objekts ähnelt einem Funktionsaufruf.

>>> ob = MyClass()

Dadurch wird ein neues Instanzobjekt mit dem Namen ob erstellt. Wir können auf Attribute von Objekten mit dem Objektnamenpräfix zugreifen.

Attribute können Daten oder Methoden sein. Methode eines Objekts sind entsprechende Funktionen dieser Klasse. Jedes Funktionsobjekt, das ein Klassenattribut ist, definiert eine Methode für Objekte dieser Klasse.

class Auto():
def __init__(self, name, baujahr,Begruessung,gruss):
    self.name = name
    self.baujahr = baujahr

def SageHallo(self):
    print("Hallo, mein Hersteller ist " + self.name)

def NeuerName(self, name):
    self.name = name

def NeuesBaujahr(self, baujahr):
    self.baujahr = baujahr

def Begruessung():
    print ("Hallo")

Auto.Begruessung()

Ein weiteres Beispiel: es wird eine Kiste als Klasse angelegt:

class Kiste:
breite = 10
hoehe = 20
tiefe = 8
def getVolumen(self):
vol = self.breite
self.hoeheself.tiefe
return vol

Um ein Objekt anzulegen, wird es mit dem Klassennamen gefolgt von einem Klammerpaar initialisiert. Hier wird ein Objekt meinekiste der Klasse Kiste angelegt.

Anschließend kann auf die Attribute und die Methoden des Objekts über den Objektnamen zugegriffen werden. Zur Trennung wird ein Punkt dazwischengestellt.

meinekiste = Kiste()
meinekiste.breite = 1
meinekiste.hoehe = 2
meinekiste.tiefe = 3
print(meinekiste.getVolumen()) # gibt 6 aus

Konstruktoren

Der Konstruktor einer Klasse ist eine Funktion, die automatisch aufgerufen wird, sobald ein Objekt der Klasse erzeugt wird. Der Konstruktor kann so die Initialisierung des Objekts vornehmen. Bei Python heißt der Konstruktor einer Klasse immer __init__().

Geschützte und private Attribute und Methoden

In manchen Fällen möchte man vermeiden, dass die Attribute eines Objekts durch andere Objekte manipuliert werden können; ebenso sind manche Methoden nur für den „internen“ Gebrauch innerhalb einer Klasse geeignet. In Python gibt es für diesen Zweck sowohl geschützte („protected“) als auch private („private“) Attribute und Methoden:

  • Geschützte Member (Attribute und Methoden) werden durch einen einfach Unterstrich vor dem jeweiligen Namen gekennzeichnet. Auf derartige Attribute oder Methoden kann weiterhin von einer anderen Stelle aus sowohl lesend als auch schreibend zugegriffen werden; es ist vielmehr eine Konvention zwischen Python-Entwicklern, dass auf derartige Member nicht direkt zugegriffen werden sollte.
  • Private Member werden durch einen doppelten Unterstrich vor dem jeweiligen Namen gekennzeichnet. Auf derartige Attribute kann außerhalb der Klasse weder lesend noch schreibend zugegriffen werden.

Setter- und Getter-Methoden werden bevorzugt als so genannte „Properties“ definiert; dazu wird folgende Syntax verwendet: