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.

instagram viewer

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

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

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

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] = 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

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

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.