A Python programozás hatalmas világában van egy sor olyan funkció, amelyet a kezdők gyakran észre sem vesznek, mégis jelentős jelentőséggel bírnak a nyelv ökoszisztémájában.
A mágikus módszerek az előmódszerek halmazadefinites a Pythonban, amelyek speciális szintaktikai szolgáltatásokat biztosítanak. Könnyen felismerhetők az elején és végén lévő kettős kötőjelükről, pl __init__, __call__, __len__
… stb.
A mágikus módszerek lehetővé teszik, hogy az egyéni objektumok a beépített Python-típusokhoz hasonlóan viselkedjenek.
Ebben a cikkben a hatékony dunder funkciókra fogunk összpontosítani. Feltárjuk céljukat, és megbeszéljük a felhasználásukat.
Legyen szó kezdő Python-programozóról vagy tapasztalt programozóról, ennek a cikknek az a célja, hogy átfogó ismereteket nyújtson a Dunder-funkciókról, ezáltal hatékonyabbá és élvezetesebbé téve Python-kódolási élményét.
Ne feledje, a Python varázsa nemcsak egyszerűségében és sokoldalúságában rejlik, hanem olyan erőteljes funkcióiban is, mint a Dunder-funkciók.
Talán a legalapvetőbb dunder funkció az összes közül. Ez az a varázslatos módszer, amelyet a Python automatikusan meghív, amikor létrehozunk (vagy ahogy a neve is sugallja, inicializálunk) egy új objektumot.__init__
osztály pizza:
def __init__(ön, méret, feltétek):
self.size = méret
öntetek = feltétek
# Most készítsünk egy pizzát
my_pizza = Pizza('nagy', ['pepperoni', 'gomba'])
print(my_pizza.size) # Ez a következőt írja ki: nagy
print(my_pizza.toppings) # Ez kiírja: ['pepperoni', 'gomba']
Ebben a példában egy Pizza nevű osztály jön létre. Az __init__ függvényünket úgy állítjuk be, hogy tartalmazza az inicializáláskor megadandó paramétereket, és beállítsuk azokat az egyéni objektumunk tulajdonságaiként.
Itt az osztály példányának ábrázolására szolgál. Tehát amikor azt írjuk, hogy self.size = méret, akkor azt mondjuk: "Hé, ennek a pizza objektumnak van egy mérete attribútum size
, és azt szeretném, hogy bármilyen méretű legyen, amit megadtam az objektum létrehozásakor”.
Ez a Python varázslatos módszere, amely lehetővé teszi számunkra defikészítsen leírást egyedi termékünkhöz.
Amikor kinyomtat egy objektumot, vagy karakterláncsá alakítja a használatával str()
, Python ellenőrizze, ha van defiKitaláltam egy módszert __str__
az objektum osztályához.
Ha igen, használja ezt a módszert az objektum karakterláncsá alakításához.
A Pizza példánkat kiterjeszthetjük egy funkcióval __str__
az alábbiak szerint:
osztály Pizza: def __init__(ön, méret, feltétek): self.size = méret self.toppings = feltétek def __str__(self): return f"Egy {self.size} pizza {', '.join(self.toppings) )}" my_pizza = Pizza('nagy', ['pepperoni', 'gomba']) print(my_pizza) # Ez a következőt fogja nyomtatni: Egy nagy pizza pepperonival, gombával
__repr__
Az __str__ függvény inkább egy informális módszer egy objektum tulajdonságainak leírására. Másrészt a __repr__ az egyéni objektum formálisabb, részletesebb és egyértelműbb leírását szolgálja.
Ha hívsz repr()
egy objektumon, vagy egyszerűen beírja az objektum nevét a konzolba, a Python metódusokat fog keresni __repr__
.
Se __str__
ez nem definite, a Python fogja használni __repr__
biztonsági másolatként, amikor megpróbálja kinyomtatni az objektumot vagy karakterláncsá alakítani. Szóval ez gyakran jó ötlet defilegalább befejezni __repr__
, még ha nem is defikijön __str__
.
Íme, hogyan tudnánk defiBefejez __repr__
pizza példánkhoz:
osztály pizza:
def __init__(ön, méret, feltétek):
self.size = méret
öntetek = feltétek
def __repr__(self):
return f"Pizza('{self.size}', {self.feltöltések})"
my_pizza = Pizza('nagy', ['pepperoni', 'gomba'])
print(repr(my_pizza)) # Ez a következőt írja ki: Pizza('nagy', ['pepperoni', 'gomba'])
__repr__
egy karakterláncot ad, amelyet Python-parancsként futtathat a pizza objektum újbóli létrehozásához, míg __str__
emberibb leírást ad. Remélem, segít egy kicsit jobban megrágni ezeket a dunder módszereket!
A Pythonban mindannyian tudjuk, hogy lehetséges számokat hozzáadni az operátor segítségével +
, As 3 + 5
.
De mi van akkor, ha valamilyen egyéni objektum példányait szeretnénk hozzáadni?
A dunder funkció __add__
éppen ezt teszi lehetővé számunkra. Lehetőséget ad nekünk arra defia kezelő viselkedését +
személyre szabott termékeinken.
A következetesség érdekében tegyük fel, hogy ezt akarjuk defifejezze be a viselkedését +
pizza példánkon. Tegyük fel, hogy amikor két vagy több pizzát adunk össze, az automatikusan egyesíti az összes feltétet. Így nézhet ki:
osztály pizza:
def __init__(ön, méret, feltétek):
self.size = méret
öntetek = feltétek
def __add__(saját, egyéb):
ha nem isinstance (egyéb, pizza):
raise TypeError("Csak újabb pizzát adhatsz hozzá!")
new_toppings = self.feltöltések + egyéb.feltöltések
return Pizza (saját.méret,új_feltétek)
# Készítsünk két pizzát
pizza1 = Pizza('nagy', ['pepperoni', 'gomba'])
pizza2 = Pizza('nagy', ['olívabogyó', 'ananász'])
# És most "adjuk hozzá" őket
kombinált_pizza = pizza1 + pizza2
print(combined_pizza.toppings) # Ez a következőket írja ki: ['pepperoni', 'gomba', 'olíva', 'ananász']
Hasonlóan a dunderhez __add__
, mi is tudunk defimás aritmetikai függvények befejezése, mint pl __sub__
(kivonással az operátor használatával -
) És __mul__
(az operátor használatával történő szorzáshoz *
).
Ez a dunder módszer lehetővé teszi számunkra defifejezze be, mi a funkciója len()
vissza kell térnie az egyedi termékeinkért.
Python használ len()
egy adatstruktúra, például lista vagy karakterlánc hosszának vagy méretének lekéréséhez.
Példánkkal összefüggésben azt mondhatnánk, hogy egy pizza "hossza" a benne lévő feltétek száma. Így tudjuk megvalósítani:
osztály pizza:
def __init__(ön, méret, feltétek):
self.size = méret
öntetek = feltétek
def __len__(ön):
visszatérő lencse(önfeltöltések)
# Készítsünk egy pizzát
my_pizza = Pizza('nagy', ['pepperoni', 'gomba', 'olívabogyó'])
print(len(my_pizza)) # Ez kiírja: 3
A __len__ metódusban csak a lista hosszát adjuk vissza toppings
. Most, len(my_pizza)
megmondja, hány feltét van rajta my_pizza
.
Ez a dunder metódus lehetővé teszi az objektumok iterálhatóságát, azaz for ciklusban használható.
Ehhez nekünk is meg kell defifejezze be a funkciót __next__
, Ezt használják definish a viselkedés, amelynek vissza kell adnia a következő értéket az iterációban. Azt is jeleznie kell az iterálható eseménynek, ha nincs több elem a sorozatban. Ezt általában úgy érjük el, hogy kivételt dobunk StopIteration
.
Tegyük fel, hogy a pizzapéldánkban meg akarjuk ismételni a feltéteket. Megismételhetővé tehetjük a pizza osztályunkat definendo egy módszert __iter__
:
osztály pizza:
def __init__(ön, méret, feltétek):
self.size = méret
öntetek = feltétek
def __iter__(self):
saját.n = 0
adja vissza önmagát
def __next__(self):
if self.n < len(self.feltöltések):
eredmény = self.toppings[self.n]
saját.n += 1
vissza az eredményt
más:
emelje fel a StopIteration-t
# Készítsünk egy pizzát
my_pizza = Pizza('nagy', ['pepperoni', 'gomba', 'olívabogyó'])
# És most ismételjük át
a my_pizza feltöltéséhez:
nyomtatás (feltöltés)
Ebben az esetben a for ciklus hív __iter__
, amely inicializál egy számlálót (self.n)
és visszaadja magát a pizza tárgyat (self)
.
Ezután a for hurok hívások __next__
hogy minden feltétet sorra kapjon.
amikor __next__
visszaadta az összes fűszert, StopIteration
kivételt dob, és a for ciklus most már tudja, hogy nincs több feltöltés, így megszakítja az iterációs folyamatot.
Ercole Palmeri
Szemplasztikai műtétet végeztek az Apple Vision Pro reklámmegjelenítővel a Catania Poliklinikán…
A finom motoros készségek színezéssel történő fejlesztése felkészíti a gyerekeket olyan összetettebb készségekre, mint az írás. Kiszínezni…
A haditengerészeti szektor igazi világgazdasági hatalom, amely egy 150 milliárdos piac felé navigált...
Múlt hétfőn a Financial Times bejelentette, hogy megállapodást köt az OpenAI-val. Az FT engedélyezi világszínvonalú újságírását…