Möchten Sie mit objektorientiertem Design in Python beginnen? Machen Sie noch heute die ersten Schritte und lernen Sie die __init__-Methode von Python kennen.
In diesem Lernprogramm werden wir die Grundlagen von Python-Klassen und -Objekten besprechen und anschließend die __init__-Methode
kennenlernen.
Am Ende dieses Tutorials werden Sie in der Lage sein, die folgenden Fragen zu beantworten:
- Was sind Instanzvariablen oder Instanzattribute?
- Wie hilft die init-Methode bei der Initialisierung der Instanzattribute?
- Wie können wir Standardwerte für Attribute festlegen?
- Wie können wir Klassenmethoden als Konstruktoren verwenden, um Objekte zu erstellen?
Lassen Sie uns beginnen.
Python-Klassen und -Objekte
Klassen sind die Grundlage für die objektorientierte Programmierung in Python. Wir können eine Klasse erstellen und Attribute und Methodendefinieren , um Daten und zugehörige Funktionen miteinander zu verknüpfen.
Sobald wir eine Klasse erstellt haben, können wir sie als Blaupause (oder Vorlage) verwenden, um Objekte (Instanzen) zu erstellen.
👩🏫Example Zeit! Lassen Sie uns eine Klasse Employee
erstellen, wobei jedes Objekt dieser Klasse die folgenden Attribute hat:
full_name
: der vollständige Name des Mitarbeiters im FormatfirstName lastName
emp_id
: die ID des Mitarbeitersdepartment
: die Abteilung, zu der der Mitarbeiter gehörtexperience
: die Anzahl der Jahre an Erfahrung, die der Mitarbeiter hat
Was bedeutet dies? 🤔
Jeder einzelne Mitarbeiter ist eine Instanz oder ein Objekt der Klasse Employee
. Und jedes Objekt hat seinen eigenen Wert für full_name
, emp_id
, department
und experience
.
Diese Attribute werden auch als Instanzvariablen bezeichnet, und wir werden die Begriffe Attribute und Instanzvariablen synonym verwenden.
Zum Hinzufügen von Attributen kommen wir gleich noch. Im Moment erstellen wir eine Klasse Employee
wie folgt:
class Employee:
pass
Die Verwendung von pass
(als Platzhalter) hilft uns, Fehler zu vermeiden, wenn wir das Skript ausführen.
Obwohl die aktuelle Version der Klasse Employee
nicht sehr hilfreich ist, ist sie immer noch eine gültige Klasse. Wir können also Objekte der Klasse Employee
erstellen:
employee_1 = Employee()
print(employee_1)
#Ausgabe: <__main__.Employee Objekt bei 0x00FEE7F0>
Wir können auch Attribute hinzufügen und sie wie gezeigt mit Werten initialisieren:
employee_1.full_name = 'Amy Bell'
employee_1.department = 'HR'
Aber dieser Ansatz zum Hinzufügen von Instanzattributen ist sowohl ineffizient als auch fehleranfällig. Außerdem ist es so nicht möglich, eine Klasse als Vorlage für die Erstellung von Objekten zu verwenden. Hier hilft die Methode __init__
.
Die Rolle der __init__-Methode in einer Python-Klasse verstehen
Wir sollten in der Lage sein, die Instanzvariablen zu initialisieren, wenn wir ein Objekt instanziieren und die __init__
Methode hilft uns dabei. Die __init__-Methode
wird jedes Mal aufgerufen, wenn ein neues Objekt der Klasse erstellt wird, um die Werte der Instanzvariablen zu initialisieren.
Wenn Sie in einer Sprache wie C programmiert haben, werden Sie feststellen, dass die __init__-Methode
ähnlich wie Konstruktoren funktioniert.
Definieren der __init__-Methode
Fügen wir der Klasse Employee
die Methode __init__
hinzu:
class Employee:
def __init__(self, full_name,emp_id,department,experience):
self.full_name = full_name
self.emp_id = emp_id
self.abteilung = abteilung
self.Erfahrung = Erfahrung
Der Parameter self
verweist auf die Instanz der Klasse und self.attribute
initialisiert das Instanzattribut
auf den Wert auf der rechten Seite.
Wir können nun Objekte wie folgt erstellen:
employee_2 = Mitarbeiter('Bella Joy','M007','Marketing',3)
print(mitarbeiter_2)
# Ausgabe: <__main__.Employee Objekt bei 0x017F88B0>
Wenn wir die Mitarbeiterobjekte ausdrucken, erhalten wir außer der Klasse, zu der sie gehören, keine nützlichen Informationen. Fügen wir eine __repr__-Methode
hinzu, die eine Repräsentationszeichenkette für die Klasse definiert:
def __repr__(self):
return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."
Wenn wir __repr__
zur Klasse Employee
hinzufügen, haben wir:
class Employee:
def __init__(self, full_name,emp_id,department,experience):
self.full_name = full_name
self.emp_id = emp_id
self.abteilung = abteilung
self.Erfahrung = Erfahrung
def __repr__(self):
return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."
Jetzt haben die Mitarbeiterobjekte eine hilfreiche Repräsentationszeichenkette:
print(mitarbeiter_2)
# Ausgabe: Bella Joy,M007 aus Marketing mit 3 Jahren Erfahrung.
Einige Konventionen
Bevor wir weitermachen, hier noch ein paar Hinweise:
- Wir haben
self
als ersten Parameter in der Methode__init__
verwendet, um auf die Klasseninstanz selbst zu verweisen, undself.attribute_name
verwendet, um die verschiedenen Attribute zu initialisieren. Die Verwendung vonself
ist die bevorzugte Konvention (Sie können aber auch jeden anderen Namen verwenden). - Bei der Definition der
__init__-Methode
haben wir die Parameternamen in den__init__-Definitionen
so festgelegt, dass sie mit den Namen der Attribute übereinstimmen. Dies verbessert die Lesbarkeit.
So fügen Sie Standardwerte für Attribute hinzu
In dem Beispiel, das wir bisher kodiert haben, sind alle Attribute erforderlich. Das bedeutet, dass die Objekterstellung nur dann erfolgreich ist, wenn wir die Werte für alle Felder an den Konstruktor übergeben.
Versuchen Sie, ein Objekt der Klasse Employee zu instanziieren, ohne den Wert für das Attribut experience zu übergeben:
employee_3 = Employee('Jake Lee','E001','Engineering')
Sie erhalten die folgende Fehlermeldung:
Traceback (letzter Aufruf):
Datei "main.py", Zeile 22, in <module>
employee_3 = Mitarbeiter('Jake Lee','E001','Ingenieurwesen')
TypeError: __init__() fehlt 1 erforderliches positionales Argument: 'experience'
Wenn Sie jedoch bestimmte Attribute optional machen wollen, können Sie dies tun, indem Sie bei der Definition der __init__-Methode
Standardwerte für diese Attribute angeben.
Hier geben wir einen Standardwert von 0
für das Attribut ‘ Erfahrung
‘ an:
class Employee:
def __init__(self, full_name,emp_id,department,experience=0):
self.full_name = full_name
self.emp_id = emp_id
self.abteilung = abteilung
self.Erfahrung = Erfahrung
def __repr__(self):
return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."
Das Objekt employee_3
wird ohne Wert für das Attribut experience
erstellt; für experience
wird der Standardwert 0 verwendet.
employee_3 = Mitarbeiter('Jake Lee','E001','Technik')
print(mitarbeiter_3.erfahrung)
# Ausgabe: 0
Alternative Klassenkonstruktoren mit Klassenmethoden
Bisher haben wir nur gesehen, wie man die Methode __init__
definiert und bei Bedarf Standardwerte für Attribute setzt. Wir wissen auch, dass wir die Werte für die erforderlichen Attribute im Konstruktor übergeben müssen.
Manchmal liegen die Werte für diese Instanzvariablen (oder Attribute) jedoch in einer anderen Datenstruktur vor, z.B. in einem Tupel, einem Wörterbuch oder einem JSON-String.
Was tun wir also?
Lassen Sie uns ein Beispiel nehmen. Angenommen, wir haben die Werte der Instanzvariablen in einem Python-Wörterbuch:
dict_fanny = {'name':'Fanny Walker','id':'H203','dept':'HR','exp':2}
Wir können auf das Wörterbuch zugreifen und alle Attribute wie folgt abrufen:
name = dict_fanny['name']
id = dict_fanny['id']
dept = dict_fanny['dept']
exp = dict_fanny['exp']
Danach können Sie ein Objekt erstellen, indem Sie diese Werte an den Konstruktor der Klasse übergeben:
employee_4 = Employee(name, id, abt, exp)
print(mitarbeiter_4)
# Ausgabe: Fanny Walker,H203 aus der Personalabteilung mit 2 Jahren Erfahrung.
Denken Sie daran: Sie müssen dies für jedes neue Objekt tun, das Sie erstellen. Dieser Ansatz ist ineffizient und wir können es definitiv besser machen. Aber wie?
In Python können wir Klassenmethoden als Konstruktoren verwenden, um Objekte der Klasse zu erstellen. Um eine Klassenmethode zu erstellen, verwenden wir den @classmethod
Dekorator.
Definieren wir eine Methode, die das Wörterbuch analysiert, die Werte der Instanzvariablen abruft und sie verwendet, um Employee-Objekte
zu erstellen.
@classmethod
def from_dict(cls,data_dict):
full_name = data_dict['name']
emp_id = data_dict['id']
abteilung = data_dict['abteilung']
erfahrung = data_dict['exp']
return cls(vollständiger_name, emp_id, abteilung, erfahrung)
Wenn wir Objekte mit Daten aus dem Wörterbuch erstellen müssen, können wir die Klassenmethode from_dict()
verwenden.
💡 Beachten Sie die Verwendung von
cls
in der Klassenmethode anstelle vonself
. Genauso wie wir self verwenden, um auf die Instanz zu verweisen, wirdcls
verwendet, um auf die Klasse zu verweisen. Außerdem sind die Klassenmethoden an die Klasse und nicht an Objekte gebunden.
Wenn wir also die Klassenmethode from_dict()
aufrufen, um Objekte zu erstellen, rufen wir sie für die Klasse Employee
auf:
emp_dict = {'name':'Tia Bell','id':'S270','dept':'Sales','exp':3}
employee_5 = Employee.from_dict(emp_dict)
print(mitarbeiter_5)
# Ausgabe: Tia Bell,S270 aus Sales mit 3 Jahren Erfahrung.
Wenn wir nun für jeden der n
Angestellten ein Wörterbuch haben, können wir die Klassenmethode from_dict()
als Konstruktor verwenden, um Objekte zu instanziieren, ohne die Werte der Sofortvariablen aus dem Wörterbuch abrufen zu müssen.
📝AAnmerkung zu Klassenvariablen
Hier haben wir die Klassenmethode definiert, die an die Klasse und nicht an einzelne Instanzen gebunden ist. Ähnlich wie Klassenmethoden können wir auch Klassenvariablen haben.
Wie Klassenmethoden sind auch Klassenvariablen an die Klasse und nicht an eine Instanz gebunden. Wenn ein Attribut einen festen Wert für alle Instanzen der Klasse annimmt, können wir sie als Klassenvariablen definieren.
FAQs
Die __init__-Methode
in einer Klassendefinition ermöglicht es uns, die Attribute oder Instanzvariablen aller Instanzen der Klasse zu initialisieren. Die __init__-Methode
wird jedes Mal aufgerufen, wenn eine neue Instanz der Klasse erstellt wird.
Das Ziel von mehreren __init__-Methoden
in einer Python-Klasse ist es, mehrere Konstruktoren zur Verfügung zu stellen, die Objekte instanziieren. Sie können jedoch nicht mehrere __init__-Methoden
definieren. Wenn Sie mehrere __init__-Methoden
definieren, überschreibt die zweite und aktuellste Implementierung die erste. Sie können jedoch den @classmethod
Dekorator verwenden, um Klassenmethoden zu definieren, die als Konstruktoren zur Instanzierung von Objekten verwendet werden können.
Wenn Sie die __init__-Methode
nicht definieren, können Sie trotzdem Objekte instanziieren. Allerdings müssen Sie dann manuell Instanzvariablen hinzufügen und ihnen jeweils Werte zuweisen. Sie können die Werte für die Instanzvariablen nicht in den Konstruktor übernehmen. Dies ist nicht nur fehleranfällig, sondern macht auch den Zweck der Klasse als Blaupause zunichte, aus der wir Objekte instanziieren können.
Ja, es ist möglich, bei der Definition der __init__-Methode
Standardwerte für ein oder mehrere Attribute anzugeben. Durch die Angabe von Standardwerten können Sie diese Attribute im Konstruktor optional machen. Die Attribute nehmen die Standardwerte an, wenn wir die Werte für diese Attribute nicht im Konstruktor übergeben.
Ja, Sie können den Wert eines Attributs jederzeit außerhalb der __init__-Methode
aktualisieren. Sie können auch neue Attribute dynamisch zu einer Instanz hinzufügen, nachdem Sie die jeweilige Instanz erstellt haben.
Fazit
In diesem Tutorial haben wir gelernt, wie man die __init__-Methode
verwendet, um die Werte von Instanzvariablen zu initialisieren. Obwohl dies einfach ist, kann es sich wiederholen – vor allem, wenn Sie viele Attribute haben.
Wenn Sie daran interessiert sind, können Sie das Modul dataclasses erkunden. Ab Python 3.7 können Sie das eingebaute Datenklassenmodul verwenden, um Datenklassen zu erstellen, die Daten speichern. Zusätzlich zu den Standardimplementierungen von __init__
und anderen häufig verwendeten Methoden verfügen sie über eine Menge cooler Funktionen für Typhinweise, komplexe Standardwerte und Optimierung.
Als nächstes erfahren Sie mehr über if __name__==’__main__’ in Python.