Ugrás a fő tartalomra
Közepes Python2026-07-29 · 10 perc olvasás

Python dekorátorok magyarázata: A @tulajdontól a Logic újrapróbálkozásáig 15 percen belül (2026)

A dekorátorok az a funkció, amely elválasztja az „ismeri a Pythont” és a „folyékonyan olvassa Python” funkciót. Varázslatosnak tűnnek, de mechanikusak: a @decorator egy függvényen pontosan f = dekorátor(f). Ennyi. Minden más ebben az oktatóanyagban az, hogy egy vonalat különböző alakzatokban alkalmaznak.

Az egysoros elmélet

Amikor írod:

▶ PYTHONeditable · runs in your browser

A Python a következőre alakítja át:

▶ PYTHONeditable · runs in your browser

Ez az egész szerelő. A "def" feletti "@dekorátor_neve" a "def_name = dekorátor_neve(def_name)" parancsot futtatja a definíció után. Ha ezt belsővé tesszük, a lakberendezők örökre nem lesznek titokzatosak.

Az első dekoratőr megírása (60 másodperc)

A dekorátor minden olyan meghívható, amely függvényt vesz fel és függvényt ad vissza. Tipikus forma:

▶ PYTHONeditable · runs in your browser

Az *args, **kwargs a csomagolásban egy védekező minta – lehetővé teszi, hogy a dekoratőr bármilyen funkción dolgozzon, aláírástól függetlenül. Hagyja ki, és azt fogja kapni, hogy a `TypeError: wrapper() 0 pozícióargumentumot vesz fel, de 2-t kapunk' abban a pillanatban, amikor valaki paraméterekkel díszíti a függvényt.

A @functools.wraps javítás

Egy apró hiba: a díszítés után az add.__name__ a "wrapper"-t jelenti, nem az "add"-t. A dokumentumkarakterláncok és a típus-tippek is eltűnnek. A javítás egyetlen importálás:

▶ PYTHONeditable · runs in your browser

Szabály: minden díszítőnek, amit ír, használja a `@functools.wraps(fn)` karakterláncot. Egy sorba kerül, és megakadályozza a hibakeresési fájdalmak egy egész kategóriáját (introspekció, "pytest" fixtures, "naplózás" formázók, "pickle" - mindez csendben törik e nélkül).

A négy dekorátor, amelyet minden kódbázisban látni fog

1. @tulajdon — számított attribútumok

▶ PYTHONeditable · runs in your browser

A @property egy metódust hívhatóvá tesz mintha attribútum lenne. Tökéletes csak olvasható származtatott értékekhez. Az írási útvonalhoz tartozik még az "@area.setter" is, de a "@property" használatának 90%-a csak olvasható.

2. @staticmethod és @classmethod

▶ PYTHONeditable · runs in your browser

A "@classmethod" megkapja a cls-t (magát az osztályt), és alternatív konstruktorokhoz használják. A @staticmethod nem kap semmi különöset, és egy egyszerű függvény, amely történetesen az osztály névterében él.

3. @functools.cache — memoisation

▶ PYTHONeditable · runs in your browser

Az egyik legerősebb stdlib dekorátor. Automatikusan megjegyzi a függvényt az argumentumai alapján. Megköveteli, hogy minden arg kivonatolható legyen (nincs listák / diktátumok argumentumként – használjon sorokat).

4. @dataclasses.dataclass — a rendszerelemek eltávolítása

▶ PYTHONeditable · runs in your browser

A @dataclass beolvassa az osztályszintű típusú megjegyzéseket, és automatikusan generálja a __init__, __repr__, __eq__ és (a frozen=True) __hash__-t. Ez a legnagyobb életminőség-javítás a Python 3.7+ verziójában.

"@újrapróbálkozz" dekorátor írása (valódi példa)

Egy dekorátor, amely újrapróbál egy funkciót hiba esetén exponenciális visszalépéssel:

▶ PYTHONeditable · runs in your browser

Figyeljük meg a három beágyazott függvényt: a retry elfogadja a konfigurációs paramétereket, és a decoratort' adja vissza; a decorator elfogadja a függvényt, és visszaadja a wrappert'; wrapper futtatja az újrapróbálkozási ciklust. Ez a háromrétegű minta így néz ki minden érvekkel rendelkező lakberendező – ne a konkrét példát, hanem a formát jegyezze meg.

Osztályalapú dekorátorok (ritka, de hasznos)

A lakberendező bármilyen hívható. A „__call__” osztályok is működnek:

▶ PYTHONeditable · runs in your browser

Akkor használja, ha a dekorátornak olyan tartási állapotot kell tartania, amely túlél egyetlen hívást (számláló, gyorsítótár, sebességkorlátozási gyűjtő).

Gyakori buktatók

1. A `@functools.wraps` elfelejtése — az önvizsgálat némán megszakad.

2. Mutable alapértelmezett argumentumok magában a dekorátorban — a klasszikus "def wrapper(x, cache=[])" hiba itt is csíp.

3. Díszítési módszerek az „én” elfogadása nélkül – ne feledje, hogy az „én” csak egy pozíciós érv; *args, **kwargs jól elkapja.

4. Rendezési szempontok halmozáskor: @a\n@b\ndef f() az f = a(b(f)). Olvassa el a halmokat alulról felfelé.

Gyakorolj

Írjon egy "@timing" dekorátort, amely kiírja, hogy mennyi ideig tart a becsomagolt függvény futása, majd alkalmazza azt egy olyan függvényre, amely az "összeg(tartomány(10_000_000))" értéket számolja ki. Az egész dekorátor 8 soros, functools.wraps + time.perf_counter.


Miután belátta, hogy az „@x” az „f = x(f)”, a dekorátorok a Python egyik legtermékenyebb funkciójává válnak. Valódi kódbázisokban mindenhol megtalálhatók: Flask/FastAPI útvonalak (@app.route), pytest fixture-ek (@pytest.fixture), Django nézetek (@login_required), Pydantic érvényesítők (@field_validator). Ha megtanulja saját maga megírni ezeket, akkor felszabadítja a képességet, hogy mindegyiket olvassa.

Következő lépés: 10 gyakorlati dekorációs lecke – építse meg a "@retry", a "@memoise", a "@rate_limit" és a "@requires_auth" elemeket a semmiből, valódi Python futtatásával a böngészőben.

Készen áll a kipróbálására?

Ingyenes 15 óra ingyenes regisztráció után – kártya nélkül. Kísérje ki a platformot, majd döntse el.

Kezdje ingyen →

Or unlock every lesson

Pro — $12/mo, unlimited AI, cancel any time. Refund within 14 days worldwide.

See Pro plans →

Get one Python lesson + one career idea every Friday

No spam, no "buy our course now". Three bullets, every Friday. Unsubscribe with one click.