Članci

Python i napredne metode, dunder funkcije za bolje programiranje

Python je fantastičan programski jezik, a o čemu svjedoči GitHub, takođe je drugi najpopularniji jezik u 2022.

Najzanimljivije prednosti Pythona su velika zajednica programera.

Čini se da Python ima paket za svaki slučaj upotrebe.

U ogromnom svijetu Python programiranja, postoji niz funkcija koje početnici često ne primjećuju, a ipak imaju značajan značaj u ekosistemu jezika.

Magične metode su skup pre metodadefinite u Pythonu koje pružaju posebne sintaktičke karakteristike. Lako se prepoznaju po dvostrukim crticama na početku i na kraju, kao __init__, __call__, __len__ … itd.

Magične metode

Magične metode dozvoljavaju prilagođenim objektima da se ponašaju slično kao ugrađeni Python tipovi.

U ovom članku ćemo se fokusirati na moćne dunder funkcije. Istražit ćemo njihovu svrhu i razgovarati o njihovoj upotrebi.

Bilo da ste početnik u Pythonu ili iskusni programer, ovaj članak ima za cilj da vam pruži sveobuhvatno razumijevanje Dunderovih funkcija, čineći vaše iskustvo kodiranja na Pythonu efikasnijim i ugodnijim.

Zapamtite, magija Pythona nije samo u njegovoj jednostavnosti i svestranosti, već i u njegovim moćnim karakteristikama kao što su Dunder funkcije.

__init__

Možda najosnovnija dunder funkcija od svih. Ovo je magična metoda koju Python automatski poziva kad god kreiramo (ili kako ime kaže, inicijaliziramo) novi objekat.__init__

klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings

# Sada napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'pečurke'])

print(my_pizza.size) # Ovo će ispisati: veliko
print(my_pizza.toppings) # Ovo će ispisati: ['feferoni', 'gljive']

U ovom primjeru kreirana je klasa pod nazivom Pizza. Postavili smo našu __init__ funkciju da uključi parametre koje treba specificirati u vrijeme inicijalizacije i postavili smo ih kao svojstva za naš prilagođeni objekt.

Ovdje se koristi za predstavljanje instance klase. Dakle, kada napišemo self.size = size, kažemo: "Hej, ovaj pizza objekt ima atribut veličine size, i želim da bude bilo koje veličine koju sam naveo kada sam kreirao objekat”.

__str__ i __repr__

__Str__

Ovo je Pythonova magična metoda koja nam to omogućava defidovršite opis za naš prilagođeni artikl.

Kada odštampate objekat ili ga konvertujete u niz koristeći str(), Python provjerite da li imate defiSmislio sam metodu __str__ za klasu tog objekta.

Ako je tako, koristite tu metodu za pretvaranje objekta u string.

Možemo proširiti naš primjer Pizze tako da uključimo funkciju __str__ kako slijedi:

class Pizza: def __init__(self, size, toppings): self.size = veličina self.toppings = toppings def __str__(self): return f"A {self.size} pizza sa {', '.join(self.toppings )}" my_pizza = Pizza('velika', ['feferoni', 'pečurke']) print(my_pizza) # Ovo će ispisati: Velika pica sa feferonima, gljivama
__repr__

Funkcija __str__ je više neformalni način opisivanja svojstava objekta. S druge strane, __repr__ se koristi za pružanje formalnijeg, detaljnijeg i nedvosmislenog opisa prilagođenog objekta.

Ako pozoveš repr() na objektu ili samo ukucate ime objekta u konzolu, Python će tražiti metodu __repr__.

Se __str__ nije definite, Python će koristiti __repr__ kao rezervnu kopiju kada pokušavate da odštampate objekat ili da ga konvertujete u niz. Tako da je to često dobra ideja defizavrši barem __repr__, čak i ako ne defiizlazi __str__.

Evo kako bismo mogli defizavršiti __repr__ za naš primjer pizze:

klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings

def __repr__(self):
return f"Pizza('{self.size}', {self.toppings})"

my_pizza = Pizza('velika', ['feferoni', 'pečurke'])
print(repr(my_pizza)) # Ovo će ispisati: Pizza('velika', ['feferoni', 'gljive'])

__repr__ daje vam niz koji možete pokrenuti kao Python naredbu za ponovno kreiranje pizza objekta, dok __str__ daje vam ljudskiji opis. Nadam se da će vam pomoći da malo bolje sažvakate ove glupe metode!

__dodati__

U Pythonu svi znamo da je moguće dodati brojeve pomoću operatora +, dođi 3 + 5.

Ali šta ako želimo da dodamo instance nekog prilagođenog objekta?

Dunder funkcija __add__ omogućava nam upravo to. Daje nam mogućnost da defiokončati ponašanje operatera + na našim personalizovanim artiklima.

U interesu konzistentnosti, pretpostavimo da želimo defizavršiti ponašanje + na našem primjeru pizze. Recimo da kad god dodamo dvije ili više pizza, automatski će se kombinirati svi njihovi dodaci. Evo kako bi to moglo izgledati:

klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings

def __dodaj__(sebe, drugo):
ako nije primjer (ostalo, pizza):
raise TypeError("Možete dodati samo još jednu pizzu!")
new_toppings = self.toppings + other.toppings
vrati pizzu (sobna veličina, novi_preljevi)

# Hajde da napravimo dve pice
pizza1 = Pizza('velika', ['feferoni', 'pečurke'])
pizza2 = Pizza('velika', ['masline', 'ananas'])

# A sada hajde da ih "dodamo".
kombinovana_pizza = pizza1 + pizza2

print(combined_pizza.toppings) # Ovo će ispisati: ['feferoni', 'gljive', 'masline', 'ananas']

Slično kao i dunder __add__, možemo i mi defizavršiti druge aritmetičke funkcije kao što su __sub__ (oduzimanjem pomoću operatora -) e __mul__ (za množenje pomoću operatora *).

__len__

Ova dunder metoda nam to omogućava defizavrši ono što je funkcija len() mora se vratiti za naše prilagođene artikle.

Python koristi len() da dobijete dužinu ili veličinu strukture podataka kao što je lista ili string.

U kontekstu našeg primjera, mogli bismo reći da je "dužina" pizze broj preljeva koje ima. Evo kako bismo to mogli implementirati:

klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings

def __len__(self):
povratno sočivo (self.toppings)

# Hajde da napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive', 'masline'])

print(len(my_pizza)) # Ovo će ispisati: 3

U metodi __len__ vraćamo samo dužinu liste toppings. Sad, len(my_pizza) to će nam reći koliko je preliva na njemu my_pizza.

__procedura__

Ova dunder metoda omogućava da objekti budu iterativni, tj. može se koristiti u for petlji.

Da bismo to uradili, moramo i mi defizavršiti funkciju __next__, Ovo se koristi za defizavršiti ponašanje koje bi trebalo vratiti sljedeću vrijednost u iteraciji. Također bi trebao signalizirati iterable u slučaju da više nema elemenata u nizu. Obično to postižemo izbacivanjem izuzetka StopIteration.

Za naš primjer pizze, recimo da želimo ponoviti dodatke. Mogli bismo naš čas pizze učiniti ponovljivim definendo a method __iter__:

klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings

def __iter__(self):
self.n = 0
vratiti sebe

def __sljedeći__(sam):
ako self.n < len(self.toppings):
rezultat = self.toppings[self.n]
self.n += 1
vratiti rezultat
drugo:
podići StopIteration

# Hajde da napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive', 'masline'])

# A sada hajde da ga ponovimo
za preljev u my_pizza:
print (preljev)

U ovom slučaju, for petlja poziva __iter__, koji inicijalizira brojač (self.n) i vraća sam objekt pice (self).

Zatim, pozivi petlje for __next__ da dobijete svaki preliv redom.

Kada __next__ vratio sve začine, StopIteration izbacuje izuzetak i for petlja sada zna da nema više dodataka i stoga će prekinuti proces iteracije.

Ercole Palmeri

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.
Tagovi: python