Natančno nastavite vedenje svojih razredov s prilagodljivim preglasitvenim mehanizmom Pythona.

V Pythonu razredi zagotavljajo čisto sredstvo za povezovanje podatkov in funkcionalnosti v elemente, ki jih je mogoče ponovno uporabiti. Ustvarjanje razredov po meri vam omogoča modeliranje entitet iz resničnega sveta, kot so uporabniki, izdelki in zaposleni.

Razredi Python definirajo čarobne metode, ki jih lahko prilagodite, da lahko oblikujete vedenje svojih razredov za edinstvene situacije.

Razumevanje čarobnih metod

Predstavljajte si čarobne metode, imenovane tudi dunder metode, kot skrivne uroke ali skrite pesmi, ki jih Python samodejno pokliče, ko izvedete določena dejanja na predmetu.

Python ponuja veliko vgrajenega vedenja za razrede metode primerkov, statične metode in metode razreda. Ti lahko ustvarite razrede Python, in jih še dodatno prilagodite s čarobnimi metodami.

Čarobne metode so metode primerkov v Pythonu, ki imajo dva podčrtaja (__metoda__) pred in za imenom metode.

Te posebne metode dajejo Pythonu navodila, kako ravnati s predmeti razreda. Tukaj je nekaj pogosto uporabljenih čarobnih metod v razredih Python:

instagram viewer

  • __gt__: Ta metoda preveri, ali je en objekt večji od drugega.
  • __v__: Ta metoda se zažene, ko ustvarite primerek razreda in je namenjena predvsem inicializaciji atributov.
  • __str__: To vrne nizovno predstavitev razreda, ki opisuje predmet.
  • __repr__: Ta metoda daje izhod, ki vam omogoča ponovno ustvarjanje predmeta z uporabo eval().
  • __len__: Ko uporabljate len() funkcijo na objektu ta metoda vrne dolžino objekta.
  • __eq__: Ta metoda omogoča primerjavo med objekti z dvojno vrednostjo (==) operater.
  • __lt__: izvaja manj kot (
  • __dodaj__: Ko uporabite dodatek (+) na objektih, ki jih ta metoda izvaja in izvaja operacije dodajanja.
  • __getitem__: Omogoča vam, da pridobite elemente iz predmeta z uporabo sintakse indeksa, kot je obj[ključ].

Izvajanje čarobnih metod

Najboljši način za razumevanje čarobnih metod je njihova uporaba.

Nizovna predstavitev predmeta

Nizovno predstavitev predmeta lahko prilagodite za berljivost ali nadaljnjo obdelavo.

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

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

Tukaj imate preprosto Oseba razred z an __v__ čarobno metodo za inicializacijo. Ko natisnete p1 objekt, uporablja privzeto predstavitev niza, ki jo zagotavlja Python.

Če želite prilagoditi predstavitev niza, definirajte __str__ in __repr__ čarobne metode:

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)

Zdaj imate bolj berljivo in celovito predstavitev niza p1 predmet:

Lastnost dolžine predmeta

Predstavljajte si, da, ko pokličete len() metode predmeta Oseba, želite njihovo višino. Izvajati __len__ čarobna metoda za Oseba razred:

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__ čarobna metoda vrne atribut višine a Oseba primerek. Ko pokličeš len (p2), bo poklical __len__ čarobna metoda, ki samodejno vrne višino p2 predmet.

Ravnanje s primerjavo med predmeti

Če morate primerjati predmete razreda na podlagi določenih lastnosti razreda. Lahko definirate __eq__ čarobno metodo in uveljavite svojo primerjalno logiko.

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 __eq__ metoda primerja ime in starost lastnosti obeh Osebe predmetov za ugotavljanje enakosti.

Dvojnik je enak (==) uporablja to metodo za preverjanje enakosti namesto za primerjavo identitet. Torej dva Oseba primerki so enaki, če imajo ujemajoče se atribute imena in starosti. To vam omogoča, da preglasite privzeto vedenje preverjanja enakosti za svoj razred po meri.

Z implementacijo teh čarobnih metod lahko definirate vedenje po meri, ki bo skladno z vgrajenimi funkcijami Pythona.

Napredne magične metode

Tukaj je nekaj naprednih primerov uporabe čarobnih metod za prilagajanje razredov.

Naj razredi delujejo kot vsebniki

Z uporabo čarobnih metod lahko definirate razrede, ki se obnašajo kot vsebniki. Lahko uporabiš vsebniki, kot so tuple, za shranjevanje zbirk podatkovnih elementov. Zagotavljajo različne metode za manipulacijo, dostop in ponavljanje po vsebovanih elementih.

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

Zdaj se objekt osebe lahko obnaša kot vsebnik:

Prilagajanje dostopa do atributov

Uporabljati __getattr__ čarobno metodo lahko prilagodite atribute načina Oseba razreda se dostopa pod določenimi pogoji.

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 se bo zagnala, ko boste poskušali dostopati do atributa, ki ne obstaja neposredno v objektu. V tem primeru preveri, ali je ime atributa starost in vrne 40.

Za katero koli drugo ime atributa dvigne an AttributeError z ustreznim sporočilom.

Poskrbite, da se razredi obnašajo kot Callable

The __klic__ metoda vam omogoča, da primerek razreda obravnavate kot predmet, ki ga je mogoče priklicati (tj. funkcijo).

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

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

Ko ustvarite primerek Seštevalnik in ga nato pokličite z argumenti, __pokliči__ metoda se zažene in izvede seštevanje, preden vrne rezultat.

Preobremenitev operaterja

S čarobnimi metodami lahko izvedete preobremenitev operaterja. Preobremenitev operaterjev vam omogoča, da definirate vedenje po meri za vgrajene operaterje, ko jih uporabljate s primerki svojih razredov. Tukaj je pogost primer, ki pojasnjuje preobremenitev operaterja.

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)

Rezultat je nov vektor:

The Vektor razred definira __dodaj__ metoda, ki se zažene, ko uporabite + operator med dvema primerkoma razreda. Metoda doda ustrezne komponente obeh vektorjev in vrne novo Vektor primerek z rezultatom.

Tukaj ste videli temeljne čarobne metode, ki jih lahko implementirate, da prilagodite vedenje vašega razreda. Python ima veliko več čarobnih metod, ki ponujajo večjo prilagodljivost pri ustvarjanju razredov. Glejte na uradna dokumentacija za popoln seznam.

Objektno orientirano programiranje v Pythonu

Čarobne metode v Pythonu zagotavljajo zmogljive načine za prilagajanje in izboljšanje obnašanja razredov. Čarobne metode se ujemajo s konceptom objektno usmerjenega programiranja (OOP) v Pythonu. Zato je pomembno razumeti koncept OOP, ko poskušate uporabiti čarobne metode.