Fino prilagodite ponašanje svojih klasa s Pythonovim fleksibilnim mehanizmom nadjačavanja.
U Pythonu, klase pružaju čist način povezivanja podataka i funkcionalnosti u elemente koji se mogu ponovno koristiti. Stvaranje prilagođenih klasa omogućuje vam modeliranje entiteta iz stvarnog svijeta poput korisnika, proizvoda i zaposlenika.
Klase Pythona definiraju čarobne metode koje možete prilagoditi kako biste mogli oblikovati ponašanje svojih klasa za jedinstvene situacije.
Razumijevanje čarobnih metoda
Zamislite čarobne metode, koje se također nazivaju dunder metode, kao tajne čarolije ili skrivene napjeve koje Python automatski poziva kada izvodite određene radnje na objektu.
Python pruža mnogo ugrađenog ponašanja za klase metode instance, statičke i klase. Možeš stvoriti Python klase, te ih dodatno prilagodite čarobnim metodama.
Magične metode su metode instanci u Pythonu koje imaju dvije podvlake (__metoda__) prije i poslije naziva metode.
Ove posebne metode daju upute Pythonu o tome kako rukovati objektima klase. Evo nekih često korištenih čarobnih metoda u Python klasama:
- __gt__: Ova metoda provjerava je li jedan objekt veći od drugog.
- __u tome__: Ova metoda se pokreće kada kreirate instancu klase, a uglavnom služi za inicijalizaciju atributa.
- __str__: Ovo vraća nizovnu reprezentaciju klase koja opisuje objekt.
- __repr__: Ova metoda daje izlaz koji vam omogućuje ponovno stvaranje objekta pomoću eval().
- __len__: Kada koristite dužina () funkcija na objektu ova metoda vraća duljinu objekta.
- __eq__: Ova metoda omogućuje usporedbu između objekata koristeći dvostruko jednako (==) operator.
- __lt__: Implementira manje od (
- __dodati__: Kada koristite dodatak (+) na objektima ova metoda pokreće i izvodi operacije zbrajanja.
- __getitem__: Omogućuje vam da dohvatite stavke iz objekta pomoću sintakse indeksa, kao što je obj[ključ].
Primjena čarobnih metoda
Najbolji način za razumijevanje magijskih metoda je njihovo korištenje.
String reprezentacija objekta
Možete prilagoditi prikaz niza objekta za čitljivost ili daljnju obradu.
classPerson:
def__init__(self, name, age):
self.name = name
self.age = age
p1 = Person('John', 25)
print(p1)
Ovdje imate jednostavan Osoba razred s an __u tome__ čarobna metoda za njegovo inicijaliziranje. Kada ispisujete p1 objekt, koristi zadanu reprezentaciju niza koju pruža Python.
Da biste prilagodili prikaz niza, definirajte __str__ i __repr__ čarobne metode:
classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = heightdef__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)
Sada imate čitljiviju i sveobuhvatniju reprezentaciju niza p1 objekt:
Svojstvo duljine objekta
Zamislite to, kada nazovete dužina () metoda objekta Person, želite njihovu visinu. Provedba __len__ čarobna metoda za Osoba razred:
classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = heightdef__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__ čarobna metoda vraća atribut visine a Osoba primjer. Kad nazoveš leća (p2), nazvat će __len__ čarobna metoda koja automatski vraća visinu p2 objekt.
Rukovanje usporedbom između objekata
Ako trebate usporediti objekte klase na temelju određenih svojstava klase. Možete definirati __eq__ čarobnu metodu i implementirajte svoju logiku usporedbe.
classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = heightdef__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.heightdef__eq__(self, other):
return self.name == other.name and self.age == other.agep1 = Person('John', 25, 56)
p2 = Person('John', 25, 61)
print(p1 == p2)
The __eq__ metoda uspoređuje Ime i dob atributi njih dvoje Osobe objekti za određivanje jednakosti.
Duplo je jednako (==) koristi ovu metodu za provjeru jednakosti umjesto za usporedbu identiteta. Dakle dva Osoba instance su jednake ako imaju podudarne atribute imena i dobi. To vam omogućuje nadjačavanje zadanog ponašanja provjere jednakosti za vašu prilagođenu klasu.
Implementacijom ovih čarobnih metoda možete definirati prilagođeno ponašanje koje će biti u skladu s Python ugrađenim komponentama.
Napredne magične metode
Evo nekoliko naprednih primjera korištenja čarobnih metoda za prilagodbu razreda.
Neka se klase ponašaju kao spremnici
Pomoću čarobnih metoda možete definirati klase koje se ponašaju kao spremnici. Možeš koristiti spremnici, poput torki, za pohranjivanje zbirki podatkovnih elemenata. Oni pružaju različite metode za manipuliranje, pristup i ponavljanje kroz sadržane 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] = valuedef__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
Sada se objekt osobe može ponašati kao spremnik:
Prilagodba pristupa atributima
Koristiti __getattr__ čarobnom metodom možete prilagoditi atribute načina Osoba klasi se pristupa na temelju određenih uvjeta.
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 će se pokrenuti kada pokušate pristupiti atributu koji ne postoji izravno u objektu. U ovom slučaju, provjerava je li naziv atributa dob i vraća 40.
Za bilo koje drugo ime atributa, podiže an AttributeError uz odgovarajuću poruku.
Neka se klase ponašaju kao Callable
The __poziv__ metoda vam omogućuje da instancu klase tretirate kao objekt koji se može pozvati (tj. funkciju).
classAdder:
def__call__(self, x, y):
return x + y
adder = Adder()
print(adder(2, 3)) # 5
Kada stvorite instancu Guja a zatim ga nazovite s argumentima, __poziv__ metoda se pokreće i izvodi zbrajanje prije vraćanja rezultata.
Preopterećenje operatora
Pomoću čarobnih metoda možete izvršiti preopterećenje operatora. Preopterećenje operatora omogućuje vam definiranje prilagođenih ponašanja za ugrađene operatore kada se koriste s instancama vaših vlastitih klasa. Evo uobičajenog primjera koji objašnjava preopterećenje operatora.
classVector:
def__init__(self, x, y):
self.x = x
self.y = ydef__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)
Rezultat je novi vektor:
The Vektor klasa definira __dodati__ metoda, koja se pokreće kada koristite + operator između dvije instance klase. Metoda dodaje odgovarajuće komponente dvaju vektora i vraća novi Vektor instanca s rezultatom.
Ovdje ste vidjeli temeljne čarobne metode koje možete implementirati da biste prilagodili ponašanje svoje klase. Python ima mnogo više čarobnih metoda koje nude veću fleksibilnost pri stvaranju klasa. Odnosi se na službena dokumentacija za potpuni popis.
Objektno orijentirano programiranje u Pythonu
Čarobne metode u Pythonu pružaju moćne načine za prilagodbu i poboljšanje ponašanja klasa. Čarobne metode idu uz koncept objektno orijentiranog programiranja (OOP) u Pythonu. Stoga je važno razumjeti koncept OOP-a kada pokušavate koristiti čarobne metode.