Dostosuj zachowanie swoich klas za pomocą elastycznego mechanizmu przesłaniania Pythona.

W Pythonie klasy zapewniają prosty sposób łączenia danych i funkcjonalności w elementy wielokrotnego użytku. Tworzenie klas niestandardowych umożliwia modelowanie jednostek ze świata rzeczywistego, takich jak użytkownicy, produkty i pracownicy.

Klasy Pythona definiują magiczne metody, które można dostosować, aby umożliwić kształtowanie zachowania klas w unikalnych sytuacjach.

Zrozumienie metod magicznych

Wyobraź sobie metody magiczne, zwane także metodami dundera, jako tajne zaklęcia lub ukryte pieśni, które Python automatycznie wywołuje, gdy wykonujesz określone działania na obiekcie.

Python zapewnia wiele wbudowanych zachowań dla klas metody instancji, statyczne i klasowe. Możesz tworzyć klasy w Pythoniei dostosowuj je jeszcze bardziej, korzystając z magicznych metod.

Metody magiczne to metody instancji w Pythonie, które mają dwa podkreślenia (__metoda__) przed i po nazwie metody.

Te specjalne metody dostarczają Pythonowi instrukcji dotyczących obsługi obiektów klasy. Oto kilka powszechnie używanych metod magicznych w klasach Pythona:

  • __gt__: Ta metoda sprawdza, czy jeden obiekt jest większy od drugiego.
  • __w tym__: Ta metoda jest uruchamiana podczas tworzenia instancji klasy i służy głównie do inicjalizacji atrybutów.
  • __str__: Zwraca ciąg znaków reprezentujący klasę opisującą obiekt.
  • __repr__: Ta metoda daje wynik, który pozwala odtworzyć obiekt za pomocą ewaluacja().
  • __len__: Kiedy używasz len() funkcja na obiekcie, ta metoda zwraca długość obiektu.
  • __równik__: Ta metoda umożliwia porównywanie obiektów przy użyciu znaku podwójnego równego (==) operatora.
  • __lt__: Implementuje porównanie mniejsze niż (
  • __dodać__: Kiedy używasz dodatku (+) na obiektach ta metoda jest uruchamiana i wykonuje operacje dodawania.
  • __Zdobądź przedmiot__: Umożliwia pobieranie elementów z obiektu przy użyciu składni indeksu, np obj[klucz].

Wdrażanie magicznych metod

Najlepszym sposobem na zrozumienie metod magicznych jest ich użycie.

Ciąg reprezentujący obiekt

Można dostosować ciąg znaków reprezentujący obiekt w celu zapewnienia czytelności lub dalszego przetwarzania.

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

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

Tutaj masz proste Osoba klasa z __w tym__ magiczna metoda inicjalizacji. Kiedy drukujesz p1 obiekt, używa domyślnej reprezentacji łańcuchowej dostarczonej przez Pythona.

Aby dostosować reprezentację ciągu, zdefiniuj __str__ I __repr__ magiczne metody:

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)

Teraz masz bardziej czytelną i wszechstronną reprezentację ciągu znaków p1 obiekt:

Długość Właściwość obiektu

Wyobraź sobie, że dzwonisz do len() metodą obiektu Person, chcesz uzyskać ich wysokość. Wdrażaj __len__ magiczna metoda na Osoba klasa:

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))

The __len__ magiczna metoda zwraca atrybut wysokości a Osoba instancja. Kiedy zadzwonisz długość (p2), zadzwoni do __len__ magiczna metoda automatycznie, która zwraca wysokość p2 obiekt.

Obsługa porównywania obiektów

Jeśli chcesz porównać obiekty klasy w oparciu o pewne właściwości klasy. Możesz zdefiniować __równik__ magiczną metodę i zaimplementuj logikę porównania.

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)

The __równik__ metoda porównuje nazwa I wiek atrybuty obydwu Osoba obiekty w celu ustalenia równości.

Podwójne równe (==) używa tej metody do sprawdzania równości zamiast porównywania tożsamości. Więc dwa Osoba instancje są równe, jeśli mają pasujące atrybuty nazwy i wieku. Pozwala to zastąpić domyślne zachowanie sprawdzania równości dla klasy niestandardowej.

Implementując te magiczne metody, możesz zdefiniować niestandardowe zachowanie, które będzie spójne z wbudowanymi funkcjami Pythona.

Zaawansowane metody magiczne

Oto kilka zaawansowanych przykładów użycia magicznych metod do dostosowywania klas.

Sprawianie, że klasy działają jak kontenery

Używając metod magicznych, możesz zdefiniować klasy, które zachowują się jak kontenery. Możesz użyć kontenery, takie jak krotki, do przechowywania kolekcji elementów danych. Zapewniają różne metody manipulowania, uzyskiwania dostępu i iteracji zawartych elementów.

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

Teraz obiekt Person może zachowywać się jak kontener:

Dostosowywanie dostępu do atrybutów

Używając __getattr__ magiczną metodę, możesz dostosować sposób atrybutów Osoba dostęp do klasy jest możliwy pod pewnymi warunkami.

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

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

The __getattr__ Metoda zostanie uruchomiona, gdy spróbujesz uzyskać dostęp do atrybutu, który nie istnieje bezpośrednio w obiekcie. W tym przypadku sprawdza, czy nazwa atrybutu to wiek i zwraca 40.

Dla dowolnej innej nazwy atrybutu wywołuje an Błąd atrybutu z odpowiednim komunikatem.

Sprawianie, że klasy zachowują się jak wywoływalne

The __dzwonić__ Metoda pozwala traktować instancję klasy jako obiekt wywoływalny (tj. funkcję).

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

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

Kiedy tworzysz instancję Sumator a następnie wywołaj to z argumentami, __dzwonić__ Metoda jest uruchamiana i wykonuje dodawanie przed zwróceniem wyniku.

Przeciążenie operatora

Za pomocą magicznych metod możesz wykonać przeciążenie operatora. Przeciążanie operatorów umożliwia definiowanie niestandardowych zachowań dla operatorów wbudowanych, gdy są one używane z instancjami własnych klas. Oto typowy przykład wyjaśniający przeciążenie operatora.

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)

Rezultatem jest nowy wektor:

The Wektor klasa definiuje __dodać__ metoda, która jest uruchamiana, gdy używasz metody + operator pomiędzy dwoma instancjami klasy. Metoda dodaje odpowiednie składniki dwóch wektorów i zwraca nowy Wektor przykład z wynikiem.

Tutaj widziałeś podstawowe magiczne metody, które możesz wdrożyć, aby dostosować zachowanie swojej klasy. Python ma o wiele więcej magicznych metod, które oferują większą elastyczność podczas tworzenia klas. Patrz oficjalna dokumentacja aby uzyskać pełną listę.

Programowanie obiektowe w Pythonie

Magiczne metody w Pythonie zapewniają zaawansowane sposoby dostosowywania i ulepszania zachowania klas. Metody magiczne są zgodne z koncepcją programowania obiektowego (OOP) w Pythonie. Dlatego ważne jest, aby zrozumieć koncepcję OOP, próbując użyć metod magicznych.