Python Objects and Classes

Table of Contents

 

In diesem Tutorial lernen Sie die Kernfunktionalität von Python Objekten und  Klassen kennen. Sie erfahren, was eine Klasse ist, wie Sie sie erstellen und in Ihrem Programm verwenden.

 

Python Objects and Classes

 

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

Ein Objekt ist einfach eine Sammlung von Daten (Variablen) und Methoden (Funktionen), die auf diese Daten wirken. In ähnlicher Weise ist eine Klasse ein Bauplan für dieses Objekt.

Wir können uns eine Klasse als eine Skizze (Prototyp) eines Hauses vorstellen. Sie enthält alle Details über die Böden, Türen, Fenster usw. Auf der Grundlage dieser Beschreibungen bauen wir das Haus. Das Haus ist das Objekt.

So wie aus der Blaupause eines Hauses viele Häuser gebaut werden können, können wir aus einer Klasse viele Objekte erzeugen. Ein Objekt wird auch als Instanz einer Klasse bezeichnet und der Prozess der Erstellung dieses Objekts wird als Instanziierung bezeichnet.

 


 

 

Defining a Class in Python

 

So wie Funktionsdefinitionen in Python mit dem Schlüsselwort “def” beginnen, beginnen Klassendefinitionen mit einem “class” schlüsselwort.

Der erste String innerhalb der Klasse wird docstring genannt und enthält eine kurze Beschreibung der Klasse. Dies ist zwar nicht zwingend erforderlich, wird aber dringend empfohlen.

Hier ist eine einfache Klassendefinition.

class MyNewClass:
    '''This is a docstring. I have created a new class'''
    pass

 

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

 

Es gibt darin auch spezielle Attribute, die mit doppelten Unterstrichen beginnen __. Zum Beispiel, __doc__ gibt uns den Docstring dieser Klasse.

 

Sobald wir eine Klasse definieren, wird ein neues Klassenobjekt mit demselben Namen erstellt. Dieses Klassenobjekt ermöglicht uns den Zugriff auf die verschiedenen Attribute sowie die Instanziierung neuer Objekte dieser Klasse.

 

class Person:
    "Dies ist eine person klasse"
    age = 10

    def greet(self):
        print('Hello')


# Output: 10
print(Person.age)

# Output: <function Person.greet>
print(Person.greet)

# Output: "Dies ist eine person klasse"
print(Person.__doc__)

 

Output

10
<function Person.greet at 0x7fc78c6e8160>
Dies ist eine person klasse

 


 

 

Creating an Object in Python

 

Wir haben gesehen, dass das Klassenobjekt für den Zugriff auf verschiedene Attribute verwendet werden kann.

Es kann auch verwendet werden, um neue Objektinstanzen (Instanziierung) dieser Klasse zu erzeugen. Die Prozedur zum Erzeugen eines Objekts ist ähnlich wie ein Funktions Aufruf.

 

>>> harry = Person()

 

Dies erzeugt eine neue Objektinstanz namens harry. Wir können auf die Attribute von Objekten über das Präfix des Objektnamens zugreifen.

 

Attribute können Daten oder Methoden sein. Methoden eines Objekts sind entsprechende Funktionen dieser Klasse.

 

Dies bedeutet, dass, da Person.greet ist ein Funktionsobjekt (Attribut der Klasse), Person.greet wird ein Methodenobjekt sein.

class Person:
    "This is a person class"
    age = 10

    def greet(self):
        print('Hallo')


# ein neues Objekt der Klasse Person erzeugen
harry = Person()

# Output: <function Person.greet>
print(Person.greet)

# Output: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)

# Calling object's greet() method
# Output: Hello
harry.greet()

 

Output

<function Person.greet at 0x7fd288e4e160>
<bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>>
Hallo

 

Sie haben vielleicht bemerkt, dass die self parameter in der Funktionsdefinition innerhalb der Klasse, aber wir rufen die Methode einfach als harry.greet() ohne jegliche Argumente. Es hat trotzdem funktioniert.

 

Das liegt daran, dass bei jedem Methodenaufruf eines Objekts das Objekt selbst als erstes Argument übergeben wird. Also, harry.greet() übersetzt in Person.greet(harry).

 

Im Allgemeinen ist der Aufruf einer Methode mit einer Liste von n Argumenten äquivalent zum Aufruf der entsprechenden Funktion mit einer Argumentliste, die durch Einfügen des Objekts der Methode vor dem ersten Argument erstellt wird.

 

Aus diesen Gründen muss das erste Argument der Funktion in der Klasse das Objekt selbst sein. Dies wird konventionell als self. Es kann auch anders benannt werden, aber wir empfehlen dringend, die Konvention zu befolgen.

 

Jetzt müssen Sie mit Klassenobjekt, Instanzobjekt, Funktionsobjekt, Methodenobjekt und deren Unterschieden vertraut sein.

 


 

 

Constructors in Python

 

 

Klassenfunktionen, die mit einem doppelten Unterstrich beginnen __ werden als Sonderfunktionen bezeichnet, da sie eine besondere Bedeutung haben.

 

Von besonderem Interesse ist die __init__() Funktion. Diese spezielle Funktion wird immer dann aufgerufen, wenn ein neues Objekt dieser Klasse instanziiert wird.

Diese Art von Funktion wird in der objektorientierten Programmierung (OOP) auch Konstruktor genannt. Wir verwenden sie normalerweise, um alle Variablen zu initialisieren.

 

class ComplexNumber:
    def __init__(self, r=0, i=0):
        self.real = r
        self.imag = i

    def get_data(self):
        print(f'{self.real}+{self.imag}j')


# Erzeugen eines neuen ComplexNumber Objekts
num1 = ComplexNumber(2, 3)

# Anruf get_data() method
# Output: 2+3j
num1.get_data()

# Ein weiteres ComplexNumber Objekt erzeugen
# und legen Sie ein neues Attribut 'attr' an
num2 = ComplexNumber(5)
num2.attr = 10

# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))

# aber c1 Objekt hat kein Attribut 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
print(num1.attr)

 

Output

2+3j
(5, 0, 10)
Traceback (most recent call last):
  File "<string>", line 27, in <module>
    print(num1.attr)
AttributeError: 'ComplexNumber' object has no attribute 'attr'

 

 

Im obigen Beispiel haben wir eine neue Klasse zur Darstellung komplexer Zahlen definiert. Sie hat zwei Funktionen, __init__() um die Variablen zu initialisieren (Standardwert ist Null) und get_data() um die Nummer richtig anzuzeigen.

 

Interessant an dem obigen Schritt ist, dass Attribute eines Objekts “on the fly” erstellt werden können. Wir haben ein neues Attribut erstellt attr für Objekt num2 und lesen Sie es ebenfalls. Dies erzeugt aber nicht dieses Attribut für das Objekt num1.

 


 

 

Deleting Attributes and Objects

 

Jedes Attribut eines Objekts kann jederzeit gelöscht werden, indem die del statement. Probieren Sie Folgendes auf der Python-Shell aus, um die Ausgabe zu sehen.

>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'

>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'get_data'

 

Wir können sogar das Objekt selbst löschen, indem wir die del anweisung verwenden.

>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined

 

Eigentlich ist es komplizierter als das. Wenn wir tun c1 = ComplexNumber(1,3), wird ein neues Instanzobjekt im Speicher erzeugt und der Name c1 bindet damit.

 

Mit dem Befehl del c1, wird diese Bindung entfernt und der Name c1 wird aus dem entsprechenden Namensraum gelöscht. Das Objekt bleibt jedoch im Speicher bestehen und wird später, wenn kein anderer Name daran gebunden ist, automatisch zerstört.

 

Diese automatische Zerstörung von nicht referenzierten Objekten wird in Python auch als Garbage Collection bezeichnet.

Deleting objects in Python removes the name binding
Das Löschen von Objekten in Python entfernt die Namensbindung