Lakberendezők a python

Funkciók Python - tárgyak

Ahhoz, hogy megértsük a lakberendezők, akkor először meg kell ismernünk, hogy az összes funkciót Python egy objektum. Amely maga után vonja számos következménnyel. Tekintsük őket egy egyszerű példát:

Emlékszel, ezt a példát, akkor jöjjön vissza rá. Egy másik jellemző funkciók Python az, hogy meg lehessen állapítani a másik funkció!

Hivatkozásokat funkciók

Még mindig nem tévesztendő? És most a legérdekesebb része. Mivel a függvény nem más, mint egy tárgyat, tehát:

  • akkor lehet rendelni egy változót
  • nyilváníthatják azokat a másik funkció

Ez a funkció visszatérhet egy másik funkció eredményeként:

Stop! Ez még nem minden! Ha visszatér a funkció, és adja át paraméterként is lehetséges.

De általában, és minden, amit tudni kell lakberendezők. Azaz, lakberendezők olyasmi, mint egy kagyló. Ez lehetővé teszi, hogy végre kód előtt és után a függvény, amely körülveszik megváltoztatása nélkül a funkciót.

házi lakberendezők

Hogyan lehet őket kézzel?

Most meg kell tennie annak érdekében, hogy minden alkalommal, amikor hívást a_stand_alone_function funkciót. ehelyett próbáltak a_stand_alone_function_decorated funkciót. Elég egyszerű, csak vissza my_shiny_new_decorator funkciója a_stand_alone_function.

kiteszik lakberendezők

Az előző példában használtuk a következő szintaxist dekoratőr:

Lakberendezők egy változata a Dekoratőr tervezési minta Python. Általában néhány klasszikus minták szerepelnek Python fejlődését elősegítő folyamat, mint a iterátorokat.

Természetesen lehet felhalmozni festő:

Lakberendezők szintaxist használ Python:

Az, hogy a lakberendezők kérdésekben:

Végül a válasz arra a kérdésre

Összefoglalva, láthatjuk a választ egy kérdésre:

Elvileg lehetséges, hogy hagyja abba, de ha a vágy nem ment tanulni valami újat lakberendezők, olvasson tovább.

Paraméterek átadása funkciók körül dekoratőr

Használata festő módszerek

Ahogy az egyik lehet felvennie, lényegében, módszerek és funkciók azonosak a Python, kivéve, hogy a módszereket kell szerezni hivatkozás a szülő objektum, mint az első paraméter (ön). Ez azt jelenti, hogy a lakberendezők nekik épülnek pontosan ugyanúgy. Csak ne felejtsük el önmagáról:

Persze, hogy hozzon létre egy globális dekoratőr, amely felhasználható az összes funkcióhoz és módszereket, akkor kell használni * args és ** kwargs.

Átviteli paraméterek lakberendezők

Oké, mit szólsz a játékos téma érveket dekoratőr? Van egy kis trükk. Valójában dekoratőr tart, mint a paraméter a funkciót csak és nem tudja átadni paraméterként a funkció közvetlen körülvett lakberendező.

Mielőtt megmutatom a megoldást a problémára, nézzük meg egy példát:

Semmi sem változott. Van egy hívás my_decorator. Tehát, ha azt mondod, @my_decorator Meghatározza a cél Python meg a funkció a lakberendező.

Nem csoda. Csináljuk ugyanazt a dolgot, de hiányzik a segédváltozók:

Észre? Mi használjuk a függvényhívás a szintaxis @. Térjünk vissza a lakberendezők érveket. Ha alkalmazza a függvényt használ a lakberendezők útközben, és akkor át paraméterként a funkció, nem?

Itt van egy lakberendező érvekkel lehet állítani változók felhasználásával.

Mint látható, minden dekoratőr paraméterek átadása ebben a megközelítésben. Semmi sem akadályozza a * args és ** kwargs. De ne feledjük, hogy a lakberendezők nevezzük csak egyszer. Csak akkor, ha Python importálja a forgatókönyvet. Ez dinamikusan beállított e változók értékeit, akkor nem. Amikor importál egy script, a funkció már egy lakberendező, így változtatni valamit később nem fog működni.

Egy másik példa: a dekoratőr díszítő dekoratőr

Itt van egy ilyen bónusz. Itt van egy kódrészletet bármely dekoratőr bármilyen paramétert. Ennek eredményeként át érveket, hoztunk létre dekoratőr segítségével a kiegészítő funkciót. Nézzük levelet dekoratőr a festő:

Egy példa a felhasználásra:

Igen, úgy néz ki, mint a következő: „Ahhoz, hogy megértsük a rekurzió, először meg kell érteni a rekurziót.” De a végén nem az az érzése, hogy már elsajátította valami új és érdekes?

Megfelelő használatát lakberendezők

  • Lakberendezők lelassul funkciókat. Ne felejtsd el.
  • Távolítsuk el a lakberendező egy olyan funkciója, lehetetlen. Természetesen vannak példák arra, hogyan kell csinálni, de nem jön senki. Tehát, ha használt dekoratőr, akkor meg kell dolgozni az egész kódot.
  • Lakberendezők surround funkció, így nehéz nyomon követni.

Python 2.5 és fölött a megoldást az utolsó probléma. Ez magában foglalja a functools modul (functools.wraps), amely másolatot a modul nevét és rögzíti az egyes zadekoriovannoy funkciót. A legérdekesebb - functools.wraps egy lakberendező.

Mikor kell alkalmazni festő?

A fő kérdés - mikor, sőt, kell alkalmazni festő? Persze, hogy jól néz ki, de hol kell használni őket? Tudok adni legalább 1000 példákat. A klasszikus példa - új funkciók kerüljenek a funkció egy harmadik fél könyvtár (amely nem lehet szerkeszteni). Akkor lehet alkalmazni, lakberendezők, hogy bővítse a számos funkciót, hogy ne írja át őket minden alkalommal. Ez kiküszöböli a felesleges kód:

A legérdekesebb az, hogy tudod használni festő szinte azonnal, anélkül, hogy átírta a meglévő kódot:

Kapcsolódó cikkek