Tiksliai sureguliuokite savo klasių elgesį naudodami lankstų Python nepaisymo mechanizmą.

„Python“ klasėse yra švari priemonė duomenims ir funkcijoms sujungti į pakartotinai naudojamus elementus. Kurdami pasirinktines klases galite modeliuoti realaus pasaulio objektus, pvz., vartotojus, produktus ir darbuotojus.

„Python“ klasės apibrėžia magiškus metodus, kuriuos galite tinkinti, kad galėtumėte formuoti savo klasių elgesį unikaliose situacijose.

Magijos metodų supratimas

Įsivaizduokite magiškus metodus, dar vadinamus dunder metodais, kaip slaptus burtus arba paslėptus giesmes, kuriuos Python automatiškai iškviečia, kai atliekate tam tikrus veiksmus su objektu.

„Python“ suteikia daug integruotų klasių elgesio egzempliorius, statiniai ir klasės metodai. Tu gali sukurti Python klases, ir dar labiau pritaikykite juos naudodami magiškus metodus.

Magiški metodai yra „Python“ egzempliorių metodai, turintys du apatinius brūkšnius (__metodas__) prieš ir po metodo pavadinimo.

Šie specialūs metodai suteikia Python instrukcijas, kaip tvarkyti klasės objektus. Štai keletas dažniausiai naudojamų magijos metodų Python klasėse:

instagram viewer

  • __gt__: Šis metodas patikrina, ar vienas objektas yra didesnis už kitą.
  • __init__: Šis metodas veikia, kai kuriate klasės egzempliorių, ir jis daugiausia skirtas atributo inicijavimui.
  • __str__: grąžinama objektą aprašančios klasės eilutė.
  • __repr__: Šis metodas suteikia išvestį, leidžiančią atkurti objektą naudojant eval ().
  • __len__: Kai naudojate len() funkcija objekte, šis metodas grąžina objekto ilgį.
  • __eq__: Šis metodas leidžia palyginti objektus naudojant dvigubą lygų (==) operatorius.
  • __lt__: Tai įgyvendina mažiau nei (
  • __papildyti__: Kai naudojate priedą (+) operatorius objektuose šis metodas paleidžiamas ir atlieka papildymo operacijas.
  • __getitem__: leidžia gauti elementus iš objekto naudojant indekso sintaksę, pvz obj [raktas].

Magijos metodų įgyvendinimas

Geriausias būdas suprasti magiškus metodus yra juos naudoti.

Stygos objekto vaizdavimas

Galite tinkinti objekto eilutės atvaizdavimą, kad jį būtų galima skaityti arba toliau apdoroti.

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

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

Čia jūs turite paprastą Asmuo klasė su an __init__ magiškas metodas jį inicijuoti. Kai spausdinate p1 objektas, jis naudoja numatytąjį Python pateiktą eilutės atvaizdavimą.

Norėdami tinkinti eilutės atvaizdavimą, apibrėžkite __str__ ir __repr__ magijos metodai:

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)

Dabar turite skaitomesnį ir išsamesnį eilučių atvaizdavimą p1 objektas:

Objekto ilgio savybė

Įsivaizduokite, kai skambinate len() Asmens objekto metodą, norite jo ūgio. Įgyvendinti __len__ magiškas metodas Asmuo klasė:

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__ magic metodas grąžina aukščio atributą a Asmuo instancija. Kai skambinate len (p2), jis paskambins __len__ magiškas metodas automatiškai grąžina aukštį p2 objektas.

Objektų palyginimas

Jei reikia palyginti klasės objektus pagal tam tikras klasės savybes. Galite apibrėžti __eq__ magijos metodą ir įgyvendinkite savo palyginimo logiką.

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__ metodas lygina vardas ir amžiaus judviejų atributai Asmens lygybei nustatyti objektai.

Dvigubas lygus (==) operatorius naudoja šį metodą lygybei patikrinti, o ne tapatybei lyginti. Taigi du Asmuo egzemplioriai yra lygūs, jei jie turi atitinkamus vardo ir amžiaus atributus. Tai leidžia nepaisyti numatytosios pasirinktinės klasės lygybės tikrinimo elgsenos.

Įdiegę šiuos stebuklingus metodus galite apibrėžti pasirinktinį elgesį, kuris atitiks Python integruotus elementus.

Išplėstiniai magijos metodai

Štai keletas pažangių pavyzdžių, kaip naudoti magiškus metodus klasėms tinkinti.

Kad pamokos veiktų kaip konteineriai

Naudodami magiškus metodus galite apibrėžti klases, kurios elgiasi kaip konteineriai. Tu gali naudoti konteinerius, pavyzdžiui, korteles, saugoti duomenų elementų rinkinius. Jie siūlo įvairius būdus, kaip manipuliuoti, pasiekti ir kartoti esančius elementus.

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

Dabar asmens objektas gali veikti kaip konteineris:

Atributų prieigos tinkinimas

Naudojant __getattr__ magijos metodu galite tinkinti atributų būdą Asmuo klasė pasiekiama tam tikromis sąlygomis.

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

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

The __getattr__ metodas bus paleistas, kai bandysite pasiekti atributą, kurio tiesiogiai objekte nėra. Šiuo atveju jis patikrina, ar atributo pavadinimas yra amžiaus ir grąžina 40.

Bet kuriam kitam atributo pavadinimui jis iškelia an Atributo klaida su atitinkamu pranešimu.

Kad pamokos elgtųsi kaip skambinamos

The __skambinti__ metodas leidžia klasės egzempliorių traktuoti kaip iškviečiamą objektą (t. y. funkciją).

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

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

Kai kuriate egzempliorių Sudėtojas ir tada pavadinkite jį argumentais, __skambinti__ metodas paleidžiamas ir atlieka papildymą prieš grąžinant rezultatą.

Operatoriaus perkrova

Naudodami magiškus metodus galite atlikti operatoriaus perkrovą. Operatoriaus perkrova leidžia apibrėžti pasirinktinį įtaisytųjų operatorių elgesį, kai jie naudojami su savo klasių egzemplioriais. Štai įprastas pavyzdys, paaiškinantis operatoriaus perkrovą.

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)

Rezultatas yra naujas vektorius:

The Vektorius klasė apibrėžia __papildyti__ metodas, kuris veikia, kai naudojate + operatorius tarp dviejų klasės egzempliorių. Metodas prideda atitinkamus dviejų vektorių komponentus ir grąžina naują Vektorius pavyzdys su rezultatu.

Čia matėte pagrindinius magiškus metodus, kuriuos galite pritaikyti norėdami pritaikyti savo klasės elgesį. Python turi daug daugiau magiškų metodų, kurie suteikia daugiau lankstumo kuriant klases. Žr oficialius dokumentus dėl pilno sąrašo.

Objektinis programavimas Python

Magiški Python metodai suteikia galingų būdų pritaikyti ir pagerinti klasių elgesį. Magiški metodai eina kartu su Python objektinio programavimo (OOP) koncepcija. Taigi, bandant naudoti magiškus metodus, svarbu suprasti OOP sąvoką.