Optimieren Sie das Verhalten Ihrer Klassen mit dem flexiblen Überschreibungsmechanismus von Python.

In Python bieten Klassen eine saubere Möglichkeit, Daten und Funktionalität in wiederverwendbaren Elementen zu bündeln. Durch das Erstellen benutzerdefinierter Klassen können Sie reale Entitäten wie Benutzer, Produkte und Mitarbeiter modellieren.

Python-Klassen definieren magische Methoden, die Sie anpassen können, um das Verhalten Ihrer Klassen für einzigartige Situationen zu gestalten.

Magische Methoden verstehen

Stellen Sie sich magische Methoden, auch Dunder-Methoden genannt, als geheime Zaubersprüche oder versteckte Gesänge vor, die Python automatisch aufruft, wenn Sie bestimmte Aktionen an einem Objekt ausführen.

Python bietet viele integrierte Verhaltensweisen für Klassen Instanz-, statische und Klassenmethoden. Du kannst Erstellen Sie Python-Klassenund individualisiere sie mit magischen Methoden noch weiter.

Magic-Methoden sind Instanzmethoden in Python, die zwei Unterstriche haben (__Methode__) vor und nach dem Methodennamen.

instagram viewer

Diese speziellen Methoden geben Python Anweisungen zum Umgang mit Objekten einer Klasse. Hier sind einige häufig verwendete magische Methoden in Python-Klassen:

  • __gt__: Diese Methode prüft, ob ein Objekt größer als ein anderes ist.
  • __drin__: Diese Methode wird ausgeführt, wenn Sie eine Instanz einer Klasse erstellen, und dient hauptsächlich der Attributinitialisierung.
  • __str__: Dies gibt eine Zeichenfolgendarstellung der Klasse zurück, die das Objekt beschreibt.
  • __repr__: Diese Methode gibt eine Ausgabe aus, mit der Sie das Objekt neu erstellen können eval().
  • __len__: Wenn Sie das verwenden len() Funktion für ein Objekt: Diese Methode gibt die Länge des Objekts zurück.
  • __eq__: Diese Methode ermöglicht den Vergleich zwischen Objekten mithilfe des Double-Gleich-Werts (==) Operator.
  • __lt__: Es implementiert einen Kleiner-als-Vergleich (
  • __hinzufügen__: Wenn Sie den Zusatz (+)-Operator für Objekte, die diese Methode ausführt und Additionsoperationen durchführt.
  • __getitem__: Ermöglicht das Abrufen von Elementen aus einem Objekt mithilfe der Indexsyntax, z. B obj[Schlüssel].

Implementierung magischer Methoden

Der beste Weg, magische Methoden zu verstehen, besteht darin, sie anzuwenden.

String-Darstellung eines Objekts

Sie können die Zeichenfolgendarstellung eines Objekts zur besseren Lesbarkeit oder zur weiteren Verarbeitung anpassen.

classPerson:
def__init__(self, name, age):
self.name = name
self.age = age

p1 = Person('John', 25)
print(p1)

Hier haben Sie eine einfache Person Klasse mit einem __drin__ magische Methode, um es zu initialisieren. Wenn Sie das drucken p1 Objekt verwendet es die von Python bereitgestellte Standardzeichenfolgendarstellung.

Um die Zeichenfolgendarstellung anzupassen, definieren Sie die __str__ Und __repr__ magische Methoden:

classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

p1 = Person('John', 25, 78)
print(p1)

Jetzt haben Sie eine besser lesbare und umfassendere Zeichenfolgendarstellung von p1 Objekt:

Längeneigenschaft eines Objekts

Stellen Sie sich das vor, wenn Sie anrufen len() Wenn Sie die Methode eines Person-Objekts verwenden, möchten Sie deren Höhe. Implementieren Sie die __len__ magische Methode für die Person Klasse:

classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

def__len__(self):
return self.height

p2 = Person('Issac', 25, 89)
print(len(p2))

Der __len__ Die magische Methode gibt das Höhenattribut von a zurück Person Beispiel. Wenn du anrufst Länge (S. 2), es wird das aufrufen __len__ magische Methode automatisch, die die Höhe des zurückgibt p2 Objekt.

Umgang mit Vergleichen zwischen Objekten

Wenn Sie Objekte einer Klasse anhand bestimmter Eigenschaften der Klasse vergleichen müssen. Sie können definieren __eq__ magische Methode und implementieren Sie Ihre Vergleichslogik.

classPerson:

def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

def__len__(self):
return self.height

def__eq__(self, other):
return self.name == other.name and self.age == other.age

p1 = Person('John', 25, 56)
p2 = Person('John', 25, 61)

print(p1 == p2)

Der __eq__ Methode vergleicht die Name Und Alter Eigenschaften der beiden Person Objekte zur Bestimmung der Gleichheit.

Das Double gleich (==)-Operator verwendet diese Methode, um die Gleichheit zu prüfen, anstatt Identitäten zu vergleichen. Also zwei Person Instanzen sind gleich, wenn sie übereinstimmende Namens- und Altersattribute haben. Dadurch können Sie das Standardverhalten der Gleichheitsprüfung für Ihre benutzerdefinierte Klasse überschreiben.

Durch die Implementierung dieser magischen Methoden können Sie benutzerdefiniertes Verhalten definieren, das mit den integrierten Funktionen von Python konsistent ist.

Fortgeschrittene magische Methoden

Hier sind einige fortgeschrittene Beispiele für die Verwendung magischer Methoden zum Anpassen von Klassen.

Klassen wie Container verhalten

Mit magischen Methoden können Sie Klassen definieren, die sich wie Container verhalten. Sie können verwenden Container, wie Tupel, um Sammlungen von Datenelementen zu speichern. Sie bieten verschiedene Methoden zum Bearbeiten, Zugreifen und Durchlaufen der enthaltenen Elemente.

classPerson:
def__init__(self):
self.data = []

def__len__(self):
return len(self.data)

def__getitem__(self, index):
return self.data[index]

def__setitem__(self, index, value):
self.data[index] = value

def__delitem__(self, index):
del self.data[index]

p1 = Person()
p1.data = [10, 2, 7]
print(len(p1)) # 3

p1[0] = 5
print(p1[0]) # 5

Jetzt kann sich ein Person-Objekt wie ein Container verhalten:

Anpassen des Attributzugriffs

Verwendung der __getattr__ Mit der magischen Methode können Sie die Art und Weise der Attribute anpassen Person Der Zugriff auf die Klasse erfolgt unter bestimmten Bedingungen.

classPerson:
def__getattr__(self, name):
if name == 'age':
return40
else:
raise AttributeError(f'No attribute {name}')

p1 = Person()
print(p1.age) # 40

Der __getattr__ Die Methode wird ausgeführt, wenn Sie versuchen, auf ein Attribut zuzugreifen, das nicht direkt im Objekt vorhanden ist. In diesem Fall wird geprüft, ob der Attributname vorhanden ist Alter und gibt 40 zurück.

Für jeden anderen Attributnamen wird ein ausgelöst AttributeError mit entsprechender Meldung.

Klassen so gestalten, dass sie sich wie aufrufbar verhalten

Der __Anruf__ Mit der Methode können Sie eine Instanz der Klasse als aufrufbares Objekt (d. h. als Funktion) behandeln.

classAdder:
def__call__(self, x, y):
return x + y

adder = Adder()
print(adder(2, 3)) # 5

Wenn Sie eine Instanz von erstellen Addierer und dann mit Argumenten aufrufen, das __Anruf__ Die Methode wird ausgeführt und führt die Addition durch, bevor sie das Ergebnis zurückgibt.

Überlastung des Bedieners

Mit magischen Methoden können Sie eine Operatorüberladung durchführen. Durch das Überladen von Operatoren können Sie benutzerdefinierte Verhaltensweisen für integrierte Operatoren definieren, wenn diese mit Instanzen Ihrer eigenen Klassen verwendet werden. Hier ist ein häufiges Beispiel, das die Überlastung von Operatoren erklärt.

classVector:
def__init__(self, x, y):
self.x = x
self.y = y

def__add__(self, other):
if isinstance(other, Vector):
new_x = self.x + other.x
new_y = self.y + other.y
return Vector(new_x, new_y)
else:
raise TypeError("Unsupported operand type for +")

def__str__(self):
returnf"({self.x}, {self.y})"

# Creating two Vector instances
v1 = Vector(2, 3)
v2 = Vector(1, 4)

# Adding two Vector instances using the + operator
v3 = v1 + v2

# Printing the result
print(v3) # Output: (3, 7)

Das Ergebnis ist ein neuer Vektor:

Der Vektor Klasse definiert die __hinzufügen__ Methode, die ausgeführt wird, wenn Sie die verwenden + Operator zwischen zwei Instanzen der Klasse. Die Methode addiert die entsprechenden Komponenten der beiden Vektoren und gibt ein neues zurück Vektor Instanz mit dem Ergebnis.

Hier haben Sie grundlegende magische Methoden gesehen, die Sie implementieren können, um Ihr Klassenverhalten anzupassen. Python verfügt über viele weitere magische Methoden, die mehr Flexibilität beim Erstellen von Klassen bieten. Siehe die offizielle Dokumentation für eine vollständige Liste.

Objektorientierte Programmierung in Python

Magic-Methoden in Python bieten leistungsstarke Möglichkeiten, das Verhalten von Klassen anzupassen und zu verbessern. Magische Methoden gehen mit dem Konzept der objektorientierten Programmierung (OOP) in Python einher. Daher ist es wichtig, das Konzept von OOP zu verstehen, wenn Sie versuchen, magische Methoden anzuwenden.