Vodič za Python Decorator: Kako koristiti dekoratere u Pythonu



Ovaj članak pokriva pojam dekoratera u pythonu s detaljnim uputstvom koje uključuje razne primjere iz stvarnog života poput otmjenih dekoratora itd.

Funkcije u pythonu daju optimiziranu implementaciju logike pokretanja bilo kojeg programa, više puta s nesmetanim izvršavanjem. Dekoratori u pythonu također se vrte oko koncepta U ovom ćemo članku proći kroz Detaljno o ukrasiteljima, uključujući razne primjere u ovom tutorialu za ukrašavanje pythona. Na ovom blogu raspravlja se o sljedećim temama.

Koje su funkcije u Pythonu?

Dekoratori u Pythonu napredna su tema. Stoga prije nastavka provjerite jeste li potpuno jasni s pojmom python funkcija. Nekoliko je preduvjeta koje čovjek mora razumjeti prije nego što prijeđe na dekoratere u Pythonu.





Predmeti prve klase

U pythonu se sve tretira kao objekt uključujući sve vrste podataka , funkcije isto. Stoga je funkcija također poznata kao prvoklasni objekt i može se prenositi kao argumenti.

Pogledajmo primjer kako bismo shvatili kako to funkcionira.

def func1 (name): return f'Hello {name} 'def func2 (name): return f' {name}, Kako ste? ' def func3 (func4): return func4 ('Dragi učeniče') print (func3 (func1)) print (func3 (func2))
 Izlaz: Pozdrav Dragi učeniče Dragi učeniče, kako ste?

U gornjem primjeru koristili smo da biste dobili ime i proslijedili func1 i func2 kao argument u func3.



Unutarnje funkcije

U pythonu je moguće definirati funkcije unutar funkcije. Ta se funkcija naziva unutarnja funkcija. Evo primjera koji pokazuje kako možemo koristiti unutarnje funkcije u pythonu.

def func (): print ('prva funkcija') def func1 (): print ('prva podređena funkcija') def func2 (): print ('druga podređena funkcija') func1 () func2 () func ()
 Izlaz: prva funkcija prva funkcija djeteta druga funkcija djeteta

U gore navedenom programu nije važno kako su podređene funkcije deklarirane. Izlaz ovisi o načinu izvršavanja podređenih funkcija. Lokalno su obuhvaćeni funkcijom () tako da ih se ne može pozvati zasebno.

Ako ih pozovete zasebno, dobit ćete pogrešku jer su pohranjene kao varijable unutar func () i može se pozvati samo ako je pozvan funkc ().

Vraćanje funkcije iz funkcije

Moguće je vratiti funkciju pomoću druge funkcije. Da biste to razumjeli, pogledajte primjer u nastavku.

def func (n): def func1 (): return 'edureka' def func2 (): return 'python' ako je n == 1: return func1 else: return func2 a = func (1) b = func (2) print ( a ()) ispis (b ())
 Izlaz: edureka python

Dekoratori u Pythonu

Dekoratori u pythonu vrlo su moćni koji modificiraju ponašanje funkcije bez trajne modifikacije. U osnovi obavija drugu funkciju, a budući da su obje funkcije moguće pozvati, vraća poziv.

Osvrćući se unatrag, dekorator omotava funkciju i mijenja njezino ponašanje. Pogledajmo jednostavan primjer kako bismo razumjeli kako možemo raditi s dekoraterima u pythonu.

def function1 (function): def wrapper (): print ('hello') function () print ('welcome to python edureka') return wrapper def function2 (): print ('Pythonista') function2 = function1 (function2) function2 ( )
 Izlaz: pozdrav pythonista dobrodošao u python edureka

Kako bismo malo olakšali programere, imamo sintaksički šećer s python dekoraterima. Pogledajte primjer u nastavku da biste razumjeli kako to funkcionira.

operater razlučivosti opsega c ++
def function1 (function): def wrapper (): print ('hello') function () print ('kako ste?') return wrapper @ function1 def function2 (): print ('pythonista') function2 ()
 Izlaz: zdravo pythonista kako si

Izlaz će biti sličan gore navedenom programu, jedina razlika je u tome što smo koristili sintaksu pita sa simbolom @.

Korištenje dekoratera s argumentima

Kada imate funkciju s argumentima, ona postaje zamršenija za funkciju dekoratora, jer također trebaju argumente u deklaraciji. Za rješavanje ovog problema možemo koristiti * args i ** kwargs u funkciji unutarnjeg omota. Da biste to razumjeli, pogledajte sljedeći primjer.

def function1 (function): def wrapper (* args, ** kwargs): print ('hello') function (* args, ** kwargs) print ('welcome to edureka') return wrapper @ function1 def function2 (name): print (f '{name}') function2 ('pythonista')
 Izlaz: pozdrav pythonista dobrodošao u edureka

Vraćanje vrijednosti iz ukrašenih funkcija

Pogledajmo primjer kako bismo vidjeli kako možemo vratiti vrijednost iz ukrašene funkcije.

def function1 (function): def wrapper (* args, ** kwargs): function (* args, ** kwargs) print ('to je uspjelo') return wrapper @ function1 def function2 (name): print (f '{name} ') function2 (' python ')
 Izlaz: python je radio

Obavezno vratite svoju funkciju omota s argumentima kako biste izbjegli pogreške.

Otmjeni dekoratori u Pythonu

Sad kad znamo kako dekoratori rade u pythonu, istražimo prilično složene značajke uz pomoć nekoliko primjera.

Dekoratori razreda

Postoje dva načina za ukrašavanje klase u pythonu. Prvo je mjesto gdje možete ukrasiti metode unutar klase, postoje ugrađeni dekorateri poput @classmethod, @staticmethod i @property u pythonu. @classmethod i @staticmethod definiraju metode unutar klase koja nije povezana s bilo kojom drugom instancom klase. @property se obično koristi za prilagodbu getera i postavljača atributa klase. Pogledajmo primjer kako bismo to razumjeli.

class Square: def __init __ (self, side): self._side = side @property def side (self): return self._side @ side.setter def side (self, value): if value & gt = 0: self._side = vrijednost else: print ('pogreška') @property def area (self): return self._side ** 2 @classmethod def unit_square (cls): return cls (1) s = Square (5) print (s.side) print (s.područje)
 Izlaz: 5 25

Drugi način ukrašavanja razreda je ukrašavanje cijelog razreda. Uzmimo primjer da to shvatimo.

iz klasa podataka uvesti klasu podataka @dataclass class Karte: rank: str odijelo: str

Uređivanje klase ne odražava se na njene metode. Gotovo je slično pisanju dekoratora funkcije, jedina razlika je klasa u argumentu umjesto funkcije.

Jednokrevetna klasa

Jednostruka klasa ima samo jedan primjerak. U pythonu ima puno singletona, uključujući True, None, itd. Pogledajmo primjer kako bismo to bolje razumjeli.

uvoz functools def singleton (cls): @ functools.wraps (cls) def omot (* args, ** kwargs): ako nije wrapper.instance: wrapper.instance = cls (* args, ** kwargs) return wrapper.instance wrapper .instance = None return wrapper @singleton class One: pass first = One () second = One () print (prvi je drugi)
 Izlaz: Pravi

Korištenje 'is' vraća true samo za objekte koji su ista instanca. Gornji primjer koristi isti pristup kao i bilo koji drugi uređivač funkcija. Jedina je razlika što smo umjesto funkcije koristili cls. Također, prva i druga potpuno su ista instanca.

Dekorateri za gniježđenje

Možete koristiti više dekoratera slažući ih jedan na drugog. Uzmimo primjer da shvatimo kako ovo funkcionira.

@ function1 @ function2 def function (name): print (f '{name}')

Na ovaj način možemo koristiti ugniježđene dekoratere slažući ih jedan na drugog. U gornjem primjeru to je samo puki prikaz, da bi to funkcioniralo, trebali biste definirati function1 i function2 s funkcijama omota unutar svake od njih.

Argumenti u dekorateru

Uvijek je korisno prenijeti argumente u dekoratoru. Razmotrimo sljedeći primjer.

c ++ fibonaccijeva rekurzija
uvoz functools def ponov (num): def decorator_repeat (func): @ functools.wraps (func) def omot (* args, ** kwargs): za _ u rasponu (num): value = func (* args, ** kwargs ) return value return wrapper return decorator_repeat @repeat (num = 4) def function (name): print (f '{name}') function ('python')
 Izlaz: python python python python

To nas dovodi do kraja ovog članka gdje smo naučili kako s primjerima možemo koristiti Decorator u Pythonu. Nadam se da vam je jasno sve što je s vama podijeljeno u ovom vodiču za Python Decorator

Ako smatrate da je ovaj članak o 'Vodiču za Python Decorator' relevantan, pogledajte pouzdana tvrtka za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta.

Ovdje smo da vam pomognemo u svakom koraku na putovanju i osmislimo kurikulum koji je stvoren za studente i profesionalce koji žele biti . Tečaj je osmišljen kako bi vam pružio prednost u programiranju Pythona i osposobio vas za osnovne i napredne koncepte Pythona, zajedno s raznim Kao

Ako naiđete na neko pitanje, slobodno postavite sva svoja pitanja u odjeljku za komentare u 'Vodiču za Python Decorator' i naš će tim rado odgovoriti.