Määritelmä: Decorator on Pythonin suunnittelumalli. Se on funktio, joka ottaa toisen funktion argumenttina, lisää siihen jonkin toiminnon muokkaamatta sitä ja palauttaa toisen funktion.
Tätä kutsutaan "(@)" -toiminnoksi ja se sijoitetaan ennen funktion määrittelemistä, jonka haluamme koristaa.
syntaksi:
@koristelijan nimi
Toiminnon määrittely
Sisustajien ymmärtämiseksi meidän on tunnettava alla olevat käsitteet.
Funktiot ovat ensiluokkaisia esineitä. Se tarkoittaa, että funktio voidaan välittää argumenttina, se voidaan palauttaa toisesta funktiosta, voidaan määrittää muuttujalle, voidaan määritellä toisessa toiminnossa. Saadaksesi paremman käsityksen, katso alla olevat esimerkit.
- Funktio voidaan välittää argumenttina
Esim .: def-lisäys (n):
paluu n + 1
def demo_funcall (toiminto):
numero = 5
palautustoiminto (numero)
demo_funcall (lisäys)Tässä lisäysfunktio välitettiin argumenttina
esimerkki 1.py:
Tuotos:
>> python-esimerkki 1.py
- Toiminto voidaan palauttaa toisesta toiminnosta
Esim .: def toive ():
def say_wish ():
palauta "Hyvää syntymäpäivää"
palauta say_wish
hei = toive ()
Hei()esimerkki 2.py:
Tuotos:
>> python-esimerkki2.py
Täällä say_wish-funktio palasi toive-funktiosta - Toimintoa voidaan muokata ja määrittää muuttujalle
Esim .: def lisää (a, b):
palauta a + b
sum2nos = add # Muuttujalle määritetty funktio add
sum2nos (5,11)esimerkki 3.py:
Tuotos:
>> python-esimerkki 3.py
- Määritä toiminto toisen toiminnon sisällä
Esim .: def lisää (a, b):
def summa2 (a, b):
palauta a + b
res = summa2 (a, b)
palauta res
lisää (10,15)esimerkki 4.py:
Tuotos:
>> python-esimerkki 4.py
Päättäminen:
Python sallii sisäkkäisen toiminnon käyttää sulkeutuvan toiminnon ulompaa laajuutta.
def-tervehdys (viesti):"Enclosong-toiminto"
def send_greeting ():
"Sisäkkäinen toiminto"
tulosta (viesti)
Lähetä tervehdys()
tervehdys ("hyvää huomenta")
esimerkki 5.py:
Tuotos:
>> python-esimerkki 5.py
Kun olemme ymmärtäneet yllä olevat käsitteet, kirjoitamme esimerkin sisustajasta.
Ex1: Tässä koristelemme viestitoimintoa. Viestin tulostaminen **** sisällä muuttamatta alkuperäistä toimintoa, ts.e., viestitoiminto.
#koristelijan alkudef print_msg (toiminto):
def kääre ():
toiminto ()
paluu kääre
#koristeen loppu
def-viesti ():
tulosta ("Tämä on ensimmäinen esimerkki koristelijan esittelystä")
hei = print_msg (viesti)
Hei()
esimerkki 6.py:
Tuotos:
>> python-esimerkki 6.py
Yksinkertaisimmassa muodossa voimme sijoittaa sisustajan funktion määritelmän päälle ja kutsua funktion alla olevan kuvan mukaisesti:
Täällä mikä tahansa merkkijono, jonka haluamme koristella sisällä ***, käytä tätä sisustajaa.
Tuotos:
Useita sisustajia:
Meillä voi olla useita sisustajia yhdelle toiminnolle. Tässä sisustajaa käytetään siinä järjestyksessä kuin me kutsumme.
syntaksi:
@ sisustaja2
@ sisustaja1
Toiminnon määrittely
Tässä käytetään ensimmäistä koristajaa ja sitten toista koristajaa.
Argumenttien välittäminen sisustustoiminnoille:
Voimme välittää argumentit käärefunktiolle. Argumentit siirretään funktiolle, jota haluamme koristaa.
Esim .:
def deco_wish (funktio):def-kääre (arg1, arg2):
tulosta ('Hyväksytyt argumentit ovat', arg1, arg2)
Tulosta ('*********************')
funktio (arg1, arg2)
Tulosta ('*********************')
paluu kääre
@deco_wish
def toive (a1, a2):
tulosta (a1, a2)
toive ('Hyvä', 'Aamu')
toive ('Hyvä', 'Iltapäivä')
esimerkki 7.py:
Tuotos:
>> python-esimerkki 7.py
Siirrä muuttuja argumentteja lukijalle:
Voimme välittää minkä tahansa määrän argumentteja käyttämällä * args (ei-avainsana-argumentit kuten numerot) ja ** kwargs (avainsana-argumentit kuten sanakirja). Molemmat ovat sijaintiargumentteja ja tallentavat argumentit args- ja kwargs-muuttujiin.
Huomaa: Tässä voimme käyttää mitä tahansa nimeä argien ja kwargien sijaan, mutta näitä nimiä suositellaan käytettäväksi.
Esim .:
def dec_var_args (funtion):def-kääre (* args, ** kwargs):
tulosta ('Ei-avainsana-argumentit ovat', argumentit)
tulosta ('Avainsana-argumentit ovat', kwargs)
funktio (* args)
paluu kääre
@ dec_var_args
def fun_non_key_args (* argumentit):
sillä minä argumenteissa:
tulosta (i)
@ dec_var_args
def fun_key_args ():
tulosta (“Avainsana-argumentit”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
esimerkki 8.py:
Tuotos:
>> python-esimerkki 8.py
Ex2: Oletetaan, että meillä on 2 toimintoa
Funktio1: Laske numeroiden summa annetusta luettelosta
Tehtävä 2: Kerro jokainen numero kahdella ja lisää ne annettuun numeroluetteloon
Jos haluamme laskea kunkin suorittamiseen kuluneen ajan, voimme tehdä sen kahdella tavalla
- Aseta koodi alkamis- ja lopetusajan väliin jokaisessa toiminnossa
- Kirjoita koristelija ajan laskemiseksi
Katso alla oleva koodi, joka on ratkaistu sisustajalla:
#koristelijan alkuexe_time_calc (func):
def kääre (arg):
aloitusaika = päivämäärä.treffiaika.nyt()
func (arg)
end_time = päivämäärä.treffiaika.nyt()
tulosta ("Toiminnon suorittamiseen kuluva aika" + funktio.__nimi__ + "on" + str (end_time - end_time))
paluu kääre
#koristeen loppu
@exe_time_calc
def cal_avg (data):
summa = 0
i: lle tiedoissa:
summa + = i
tulosta ("Annetun numeroluettelon keskiarvo on", summa // len (data))
@exe_time_calc
def mul_by_2 (data):
summa = 0
i: lle tiedoissa:
summa + = + (i * 2)
tulosta ("Kaikkien numeroiden summa kertomalla 2: lla on", summa)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
esimerkki9.py:
Tuotos:
>> python-esimerkki 9.py
Yllä olevaa koristelijaa voidaan käyttää minkä tahansa toiminnon suoritusajan laskemiseen. Sisustajan avulla voimme välttää toistuvan koodin, kun tarvitsemme suoritusajan laskemisen, jotta sisustaja asetettaisiin funktion määritelmän yläpuolelle.
Päätelmä:
Sisustajat muuttavat toiminnon / menetelmän toiminnallisuutta muuttamatta koristellun toiminnon alkuperäistä koodia. Tämän avulla voimme välttää toistuvan koodin kirjoittamisen. Sisustajakonseptin tunteminen tekee meistä vahvoja pythonissa. Voimme käyttää sisustajaa seuraavissa tapauksissa:
- Valtuutus Python-kehyksissä Ex: Flask and Django
- Kirjaaminen
- Mittaa suoritusaika