Täpsustage oma klasside käitumist Pythoni paindliku alistamismehhanismi abil.
Pythonis pakuvad klassid puhast vahendit andmete ja funktsioonide koondamiseks korduvkasutatavateks elementideks. Kohandatud klasside loomine võimaldab teil modelleerida reaalseid üksusi, nagu kasutajad, tooted ja töötajad.
Pythoni klassid määratlevad maagilised meetodid, mida saate kohandada, et võimaldada teil kujundada oma klasside käitumist ainulaadsetes olukordades.
Maagiameetodite mõistmine
Kujutage ette maagilisi meetodeid, mida nimetatakse ka dunder-meetoditeks, salajaste loitsude või peidetud lauludena, mida Python automaatselt kutsub, kui teete objektiga teatud toiminguid.
Python pakub klassidele palju sisseehitatud käitumist eksemplar, staatilised ja klassimeetodid. Sa saad luua Pythoni klasseja kohandage neid maagiliste meetodite abil veelgi.
Maagilised meetodid on Pythonis eksemplarimeetodid, millel on kaks alljoont (__meetod__) enne ja pärast meetodi nime.
Need erimeetodid annavad Pythonile juhiseid klassi objektide käsitlemiseks. Siin on mõned Pythoni klassides sagedamini kasutatavad maagilised meetodid:
- __gt__: see meetod kontrollib, kas üks objekt on teisest suurem.
- __selles__: see meetod töötab, kui loote klassi eksemplari ja see on peamiselt mõeldud atribuudi lähtestamiseks.
- __str__: tagastab objekti kirjeldava klassi stringi esituse.
- __repr__: see meetod annab väljundi, mis võimaldab teil objekti kasutades uuesti luua eval().
- __len__: Kui kasutate len() See meetod tagastab objekti pikkuse.
- __ekv__: see meetod võimaldab võrrelda objekte, kasutades topelt, mis on võrdne (==) operaator.
- __lt__: See rakendab objektide jaoks vähem kui (
- __lisama__: Kui kasutate lisamist (+) operaatorit objektidel see meetod käivitab ja teostab liitmistoiminguid.
- __getitem__: Võimaldab tuua objektilt üksusi, kasutades näiteks indeksi süntaksit obj[võti].
Maagiameetodite rakendamine
Parim viis maagiliste meetodite mõistmiseks on nende kasutamine.
Objekti stringi esitus
Saate kohandada objekti stringi esitust loetavaks või edasiseks töötlemiseks.
classPerson:
def__init__(self, name, age):
self.name = name
self.age = age
p1 = Person('John', 25)
print(p1)
Siin on teil lihtne Isik klass koos an __selles__ maagiline meetod selle initsialiseerimiseks. Kui prindite p1 objekti, kasutab see Pythoni pakutavat vaikestringi esitust.
Stringi esituse kohandamiseks määrake __str__ ja __repr__ maagilised meetodid:
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)
Nüüd on teil loetavam ja põhjalikum stringi esitus p1 objekt:
Objekti pikkusomadus
Kujutage ette, kui helistate len() isikuobjekti meetod, soovite nende pikkust. Rakendada __len__ maagiline meetod Isik klass:
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__ maagiline meetod tagastab atribuudi kõrguse a Isik näiteks. Kui helistate len (lk 2), see helistab __len__ magic meetod automaatselt, mis tagastab kõrguse p2 objektiks.
Objektide võrdlemise käsitlemine
Kui teil on vaja võrrelda klassi objekte klassi teatud omaduste põhjal. Saate määratleda __ekv__ maagiline meetod ja rakendage oma võrdlusloogikat.
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 __ekv__ meetod võrdleb nimi ja vanus nende kahe atribuudid Isiku oma võrdõiguslikkuse määramise objektid.
Kahekordne võrdne (==) operaator kasutab seda meetodit identiteetide võrdlemise asemel võrdsuse kontrollimiseks. Nii et kaks Isik eksemplarid on võrdsed, kui neil on vastavad nime ja vanuse atribuudid. See võimaldab teil alistada kohandatud klassi võrdsuse kontrollimise vaikekäitumise.
Neid võlumeetodeid rakendades saate määratleda kohandatud käitumise, mis on kooskõlas Pythoni sisseehitatud seadmetega.
Täiustatud maagiameetodid
Siin on mõned täiustatud näited maagiliste meetodite kasutamisest klasside kohandamiseks.
Klasside muutmine konteineriteks
Maagiliste meetodite abil saate määratleda klasse, mis käituvad nagu konteinerid. Sa võid kasutada mahutid, nagu korteežid, et salvestada andmeelementide kogusid. Need pakuvad erinevaid meetodeid sisalduvate elementide manipuleerimiseks, neile juurde pääsemiseks ja nende kaudu itereerimiseks.
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
Nüüd võib isikobjekt käituda nagu konteiner:
Atribuutidele juurdepääsu kohandamine
Kasutades __getattr__ maagilise meetodiga saate kohandada atribuutide viisi Isik klassile pääseb juurde teatud tingimustel.
classPerson:
def__getattr__(self, name):
if name == 'age':
return40
else:
raise AttributeError(f'No attribute {name}')
p1 = Person()
print(p1.age) # 40
The __getattr__ meetod käivitub, kui proovite pääseda juurde atribuudile, mida objektis otse ei eksisteeri. Sel juhul kontrollib see, kas atribuudi nimi on vanus ja tagastab 40.
Mis tahes muu atribuudinime puhul tõstab see an AttributeError vastava teatega.
Klasside käitumise muutmine kutsutavaks
The __helistama__ meetod võimaldab käsitleda klassi eksemplari kutsutava objektina (st funktsioonina).
classAdder:
def__call__(self, x, y):
return x + y
adder = Adder()
print(adder(2, 3)) # 5
Kui loote eksemplari Lisaja ja seejärel nimetage seda argumentidega __helistama__ meetod käivitub ja lisab enne tulemuse tagastamist.
Operaator ülekoormus
Maagilisi meetodeid kasutades saate operaatorit üle koormata. Operaatori ülekoormus võimaldab teil määratleda sisseehitatud operaatorite jaoks kohandatud käitumisi, kui neid kasutatakse teie enda klasside eksemplaridega. Siin on levinud näide, mis selgitab operaatori ülekoormust.
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)
Tulemuseks on uus vektor:
The Vektor klass määratleb __lisama__ meetod, mis töötab, kui kasutate + operaator klassi kahe eksemplari vahel. Meetod lisab kahe vektori vastavad komponendid ja tagastab uue Vektor näiteks tulemusega.
Siin olete näinud põhilisi maagilisi meetodeid, mida saate oma klassi käitumise kohandamiseks rakendada. Pythonil on palju rohkem maagilisi meetodeid, mis pakuvad klasside loomisel suuremat paindlikkust. Vaadake ametlik dokumentatsioon täieliku nimekirja jaoks.
Objektorienteeritud programmeerimine Pythonis
Pythoni võlumeetodid pakuvad võimsaid viise klasside käitumise kohandamiseks ja täiustamiseks. Maagilised meetodid käivad Pythonis koos objektorienteeritud programmeerimise (OOP) kontseptsiooniga. Seega on maagiliste meetodite kasutamisel oluline mõista OOP kontseptsiooni.