Finomhangolhatja az osztályok viselkedését a Python rugalmas felülbíráló mechanizmusával.
A Pythonban az osztályok tiszta eszközt biztosítanak az adatok és a funkcionalitás újrafelhasználható elemekké történő összekapcsolására. Az egyéni osztályok létrehozása lehetővé teszi valós entitások, például felhasználók, termékek és alkalmazottak modellezését.
A Python osztályok varázslatos metódusokat határoznak meg, amelyeket testre szabhat, hogy lehetővé tegye osztályai viselkedésének egyedi helyzetekhez való alakítását.
A varázslatos módszerek megértése
Képzelje el a varázslatos módszereket, más néven dunder metódusokat, mint titkos varázslatokat vagy rejtett énekeket, amelyeket a Python automatikusan meghív, amikor bizonyos műveleteket hajt végre egy objektumon.
A Python számos beépített viselkedést biztosít az osztályok számára példány, statikus és osztálymetódusok. tudsz Python osztályok létrehozása, és varázslatos módszerekkel még jobban testreszabhatja őket.
A mágikus metódusok olyan példánymetódusok a Pythonban, amelyek két aláhúzással (__módszer__) a metódus neve előtt és után.
Ezek a speciális metódusok utasításokat adnak a Pythonnak egy osztály objektumainak kezelésére. Íme néhány gyakran használt mágikus módszer a Python osztályokban:
- __gt__: Ez a módszer azt ellenőrzi, hogy egy objektum nagyobb-e, mint a másik.
- __benne__: Ez a metódus egy osztály példányának létrehozásakor fut, és főként az attribútumok inicializálására szolgál.
- __str__: Ez az objektumot leíró osztály karakterlánc reprezentációját adja vissza.
- __repr__: Ez a módszer olyan kimenetet ad, amely lehetővé teszi az objektum újbóli létrehozását eval().
- __len__: Amikor a len() függvény egy objektumon ez a metódus az objektum hosszát adja vissza.
- __eq__: Ez a módszer lehetővé teszi az objektumok összehasonlítását a (==) operátor.
- __lt__: Az objektumok (
- __hozzáadás__: Amikor a kiegészítést (+) operátort az objektumokon ez a metódus futtatja és elvégzi az összeadási műveleteket.
- __getitem__: Lehetővé teszi elemek lekérését egy objektumból index szintaxis használatával, pl obj[kulcs].
Mágikus módszerek alkalmazása
A mágikus módszerek megértésének legjobb módja azok használata.
Egy objektum karakterlánc-ábrázolása
Testreszabhatja egy objektum karakterlánc-ábrázolását olvashatóság vagy további feldolgozás érdekében.
classPerson:
def__init__(self, name, age):
self.name = name
self.age = age
p1 = Person('John', 25)
print(p1)
Itt van egy egyszerű Személy osztály egy __benne__ varázslatos módszer inicializálására. Amikor kinyomtatja a p1 objektumot, a Python által biztosított alapértelmezett karakterlánc-ábrázolást használja.
A karakterlánc-ábrázolás testreszabásához adja meg a __str__ és __repr__ varázslatos módszerek:
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)
Most már olvashatóbb és átfogóbb karakterlánc-ábrázolása van a p1 tárgy:
Egy objektum hossztulajdonsága
Képzeld el, amikor felhívod a len() metódusát egy személy objektumhoz, akkor szeretné a magasságát. Végezze el a __len__ mágikus módszer a Személy osztály:
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))
A __len__ A magic metódus a magasság attribútumot adja vissza Személy példa. Amikor hívsz len (p2), hívja a __len__ magic metódus automatikusan visszaadja a magasságát p2 tárgy.
Az objektumok összehasonlításának kezelése
Ha össze kell hasonlítania egy osztály objektumait az osztály bizonyos tulajdonságai alapján. Meg tudod határozni __eq__ mágikus módszert, és valósítsa meg összehasonlítási logikáját.
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)
A __eq__ módszer összehasonlítja a név és kor a kettő attribútumai Személyé objektumok az egyenlőség meghatározásához.
A kétszerese egyenlő (==) operátor ezt a módszert használja az egyenlőség ellenőrzésére, nem pedig az azonosságok összehasonlítására. Tehát kettő Személy példányok egyenlőek, ha egyező név és kor attribútumokkal rendelkeznek. Ez lehetővé teszi az egyéni osztály alapértelmezett egyenlőség-ellenőrzési viselkedésének felülbírálását.
Ezeknek a varázslatos módszereknek a megvalósításával egyéni viselkedést határozhat meg, amely összhangban van a Python beépített funkcióival.
Speciális varázslatos módszerek
Íme néhány speciális példa a varázslatos módszerek használatára az osztályok testreszabására.
Az osztályok konténerként viselkednek
Magic metódusokkal olyan osztályokat definiálhat, amelyek konténerként viselkednek. Te tudod használni konténerek, például sorok, adatelem-gyűjtemények tárolására. Különféle módszereket kínálnak a benne lévő elemek manipulálására, elérésére és iterálására.
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
Most egy Person objektum tárolóként viselkedhet:
Attribútum-hozzáférés testreszabása
Használni a __getattr__ mágikus módszerrel testreszabhatja az attribútumok módját Személy osztály elérése bizonyos feltételek alapján történik.
classPerson:
def__getattr__(self, name):
if name == 'age':
return40
else:
raise AttributeError(f'No attribute {name}')
p1 = Person()
print(p1.age) # 40
A __getattr__ metódus fog futni, amikor olyan attribútumot próbál elérni, amely nem létezik közvetlenül az objektumban. Ebben az esetben ellenőrzi, hogy az attribútum neve megfelelő-e kor és 40-et ad vissza.
Bármilyen más attribútumnév esetén egy AttributeError megfelelő üzenettel.
Az osztályok hívható viselkedésének kialakítása
A __hívás__ metódus lehetővé teszi, hogy az osztály egy példányát hívható objektumként (azaz függvényként) kezeljük.
classAdder:
def__call__(self, x, y):
return x + y
adder = Adder()
print(adder(2, 3)) # 5
Amikor létrehoz egy példányt a Vipera majd nevezzük érvekkel, a __hívás__ metódus lefut, és végrehajtja az összeadást az eredmény visszaadása előtt.
Kezelő túlterhelése
Mágikus módszerekkel végrehajthatja a kezelő túlterhelését. Az operátorok túlterhelése lehetővé teszi egyéni viselkedések meghatározását a beépített operátorok számára, amikor saját osztályainak példányaival használják. Íme egy gyakori példa, amely megmagyarázza az operátor túlterhelését.
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)
Az eredmény egy új vektor:
A Vektor osztály határozza meg a __hozzáadás__ módszer, amely akkor fut le, amikor a + operátort az osztály két példánya között. A metódus összeadja a két vektor megfelelő komponenseit, és egy újat ad vissza Vektor például az eredménnyel.
Itt olyan alapvető varázslatos módszereket láthat, amelyek segítségével testreszabhatja az osztály viselkedését. A Python sokkal több varázslatos módszerrel rendelkezik, amelyek nagyobb rugalmasságot kínálnak az osztályok létrehozása során. Utal hivatalos dokumentáció a teljes listáért.
Objektum-orientált programozás Pythonban
A Python mágikus módszerei hatékony módszereket kínálnak az osztályok viselkedésének testreszabására és javítására. A mágikus módszerek együtt járnak a Python objektumorientált programozásának (OOP) koncepciójával. Ezért fontos megérteni az OOP fogalmát, amikor mágikus módszereket próbálunk használni.