python lakberendezők elejétől a végéig

Python: Funkciók tárgyként

Ahhoz, hogy megértsük, mi a lakberendezők, akkor először meg kell értenie, hogy a funkció python - kifogásolja. Ez a megértés nagyon fontos. Nézzünk egy egyszerű példát:








Nos, ezt az információt szem előtt tartva, Hamarosan vissza rá. Egy másik érdekes tulajdonsága funkciók Python, az, hogy meg lehet határozni ... belül egy másik funkció!

Súgó funkció

Nos, még mindig itt vagy? Most a szórakoztató része kezdődik. Azt már láttuk, hogy a funkciók tárgyak és ezért:
-Ők lehet rendelni egy változó;
-Lehet meghatározni az egyéb funkciókat.

Ennek eredményeként, ez azt jelenti, hogy a függvény visszatér egyéb funkciók :-) [talán kettős jelentéssel „visszatérés”: 1) egy üzemben okozhat return utasítást a funkciók ", és a kereset, hogy visszatérjen." Jelentése nem változik semmi, csak vicces volt :-) kb. fordító]
Lássuk:

De várjunk csak, ez még nem minden! Ha vissza tudja állítani a funkciót, így tudja használni, mint egy paraméter:

Kiváló! Most már tudod, mindent meg kell érteni lakberendezők. Lakberendezők egy átalakító ami azt jelenti,
hogy azok lehetővé teszik programfuttatási előtt és után a függvényhívás, ahol csomagolják változtatni a funkciót is feleslegesen.

Lakberendezők a kezüket

Hogyan írjunk saját dekoratőr:

Most érdemes minden alkalommal, amikor hívást a_stand_alone_function helyett ez okozta a_stand_alone_function_decorated funkciót.
Ez nagyon egyszerű! Egyszerűen hozzárendelése a_stand_alone_function függvény visszatérési my_shiny_new_decorator:

Feltárja a titkait lakberendezők!

Az előző példa a dekoratőr szintaxis:

Igen, ez tényleg így van köles. dekoratőr egyszerűen rövid formája a következő:

Lakberendezők egy Python verzió a dekoratőr tervezési minta. Általában az egyszerűbb fejlesztési Python épül néhány klasszikus tervezési minták, mint például iterátorokat.

Természetesen lehet kombinálni lakberendezők egymással:

Ugyanez a dekoratőr szintaxis Python:

Az, hogy milyen sorrendben Állítsa be a festő kérdésekben:

[Mivel ez egy fordítás StackOverflow választ, akkor állandó válaszolni egy kérdésre, hogy nem hoz semmi újat, és az összefüggésben, ezért úgy döntöttem, hogy távolítsa el]

Most, akkor csak menj el a boldog vagy egy kicsit karakterlánc fel az agyat, és megtanulják, hogyan kell használni a festő egy fejlettebb szintre!

Átadás érveket dekoratőr funkció

„Dekoráció” technikák

Mi az igazán jó Python, az a tény, hogy a módszerek és a funkciók valóban egy és ugyanaz, egy különbséggel,
hogy az eljárás az első paraméterben, amely hivatkozik egy adott objektum (ön).






Ez azt jelenti, hogy lehet, hogy egy lakberendező a módszer ugyanúgy, mint a funkciók procto szem előtt tartani, hogy meg kell, hogy adja át önmagát:

Természetesen, ha csinálsz egy nagyon sokoldalú lakberendező, és szeretné, hogy ő dolgozik együtt olyan funkció vagy eljárás, függetlenül azok érveit, akkor csak a * args, ** kwargs:

Pass érvek a lakberendező

Nagy! De mit mond az a tény, hogy át az érveket önmagában lakberendező? Természetesen mi lesz, hogy kikerülje egy kicsit, mert a lakberendező funkciót kell venni egy érv, és emiatt nem tudja átadni érveket, hogy díszítik a funkció közvetlenül a lakberendező.
Mielőtt rohanás megoldani a problémát, írjunk egy kis emlékeztető:

Valójában - ez ugyanaz. Csak az úgynevezett «my_decorator». Tehát ha írsz @my_decorator, csak mondd Python meg a funkció egyes változók «my_decorator». Ez nagyon fontos, mert a tag [változó neve] közvetlenül jelzi a dekoratőr ... vagy nem! Nézzünk gonosz!

Nincs meglepetés itt. Csináljuk pontosan ugyanaz a dolog, de kihagyja a köztes változók:

Csináljuk újra, még rövidebb:

Hé, láttad ezt? Mi használjuk a függvényhívás a „@” szintaxis :-)

Visszatérve a lakberendezők érveket. Ha fel tudjuk használni a funkciót, hogy létrehoz egy lakberendező on the fly, tudjuk átadni paraméterként ezt a funkciót, nem igaz?

Itt van, dekoratőr érveket. Argumentum jelölhető: változó

Mint látható, akkor át érveket a lakberendező, mint bármilyen funkciót használja ezt a trükköt. Ön is használja a * args, ** kwargs, ha akarja. De ne feledd, a lakberendezők nevezzük csak egyszer. Amikor Python importál egy forgatókönyvet. Nem lehet dinamikusan hozzárendelni érvek utána. Amikor futtatja a «import x», a funkció már díszített, így nem lesz képes változtatni semmit.

Egy kis gyakorlat: dekoratőr, díszítő festő.

És a bónusz, adok neked egy részletet, hogy bármilyen dekoratőr részesülő bármely változó. A végén, annak érdekében, hogy érveket hoztunk létre, dekoratőr funkció használatakor. Mi csomagolva lakberendező. Minden, amit láttunk az elmúlt években, csak tekerje a funkciót? Ááá, lakberendezők! Legyen vidám és levelet dekoratőr a festő:

Tudjuk használni ezt a kódot, az alábbiak szerint:

Azt hiszem, hogy az utóbbi időben tapasztalt ugyanaz az érzés, hogy miután „Mielőtt a rekurzió, meg kell érteni a rekurziót.” De másfelől, úgy érzi elégedettség ez a fejlődés?

Legjobb gyakorlatok alkalmazásával lakberendezők

- Hozzátették Python 2.4, úgyhogy győződjön meg róla, hogy a kód fut.
- Lakberendezők lassú a függvényhívás. Azt is tartsa
- Nem lehet „razdekorirovat” funkciót. Vannak hack, amely képes létrehozni a lakberendezők, hogy lehet eltávolítani, de senki nem használja őket. Tehát amint a funkció van díszítve az örökre. Az egész kódot.
- Lakberendezők csomagolja függvény, ami bonyolítja elhárítására.
Python 2.5 megoldja az utóbbi problémát azáltal, hogy egy modul functools, beleértve functools.wraps hogy másolja a modul nevét és bármely olyan dokumentumot string „csomagolt” funkció a csomagolásában. Érdekesség, functools.wraps - dekoratőr :-)

Mint festő hasznos lehet?

Végül, a fő kérdés: Mit használhatok festő? Úgy néz ki, hűvös és erős, de jó lenne, hogy egy gyakorlati példát. Nos, van 1000 lehetséges. A klasszikus használat - expanziós viselkedését a funkció a külső könyvtárat (akkor módosíthatja azt), vagy céljára debaginga (nem akarja módosítani, mert ez csak átmeneti). Használhatja festő bővítése több funkció ugyanazzal a kóddal felülírása nélkül a semmiből minden alkalommal, a kedvéért a száraz elvet. Például:

És persze jó, hogy tudod használni festő bármit, bármikor, anélkül, hogy átírják. DRY akcióban:




Kapcsolódó cikkek