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 Format firstName lastName
  • emp_id: die ID des Mitarbeiters
  • department: die Abteilung, zu der der Mitarbeiter gehört
  • experience: die Anzahl der Jahre an Erfahrung, die der Mitarbeiter hat
Python-Classes-and-Objects

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.

Python-Objects

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&gt

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

Method-in-a-Python-Class

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&gt

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, und self.attribute_name verwendet, um die verschiedenen Attribute zu initialisieren. Die Verwendung von self 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

How-to-Add-Default-Values-for-Attributes

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&gt
    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

Alternative-Class-Constructors-Using-Class-Methods

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 von self. Genauso wie wir self verwenden, um auf die Instanz zu verweisen, wird cls 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

1. Warum brauchen Sie die Methode __init__ in Python?

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.

2. Können Sie mehrere __init__-Methoden in einer Python-Klasse haben?

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.

3. Was passiert, wenn Sie die Methode __init__ nicht in einer Klasse definieren?

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.

4. Können Sie Standardwerte für Argumente in der __init__-Methode verwenden?

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.

5. Können Sie Attribute außerhalb der __init__-Methode ändern?

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.