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: