Pisanie własnych dekoratorów
Proszę tworzyć dekoratory za pomocą funkcji opakowujących i functools.wraps.
Pisanie własnych dekoratorów to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Wprowadzenie
Czym jest dekorator?
def shout(func):
def wrapper(*a, **kw):
result = func(*a, **kw)
return str(result).upper()
return wrapper
@shout
def greet(name): return f'hello {name}'
print(greet('Alice'))Wzorzec wrappera
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f'{func.__name__} took {time.time()-start:.4f}s')
return result
return wrapper
@timer
def slow(): import time; time.sleep(0.01)
slow()functools.wraps
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*a, **kw):
print(f'calling {func.__name__}')
return func(*a, **kw)
return wrapper
@log
def add(a, b): return a + b
print(add.__name__)
add(1, 2)Dekorator z argumentami
def repeat(n):
def decorator(func):
from functools import wraps
@wraps(func)
def wrapper(*a, **kw):
for _ in range(n): func(*a, **kw)
return wrapper
return decorator
@repeat(3)
def hi(): print('hi')
hi()Łączenie dekoratorów
def bold(f):
from functools import wraps
@wraps(f)
def w(*a,**k): return '<b>' + f(*a,**k) + '</b>'
return w
def italic(f):
from functools import wraps
@wraps(f)
def w(*a,**k): return '<i>' + f(*a,**k) + '</i>'
return w
@bold
@italic
def text(): return 'hello'
print(text())Dekorator oparty na klasie
class Counter:
def __init__(self, func): self.func,self.count=func,0
def __call__(self, *a, **kw):
self.count+=1
return self.func(*a, **kw)
@Counter
def greet(name): return f'hi {name}'
greet('Alice'); greet('Bob')
print(greet.count)Dekorator memoizacji
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2: return n
return fib(n-1) + fib(n-2)
print(fib(30))Dekorator autoryzacji
def requires_auth(func):
from functools import wraps
@wraps(func)
def wrapper(user, *a, **kw):
if not user.get('authenticated'):
raise PermissionError('Not authenticated')
return func(user, *a, **kw)
return wrapper
@requires_auth
def dashboard(user): return 'Welcome!'
try: dashboard({'authenticated': False})
except PermissionError as e: print(e)Dekorator ponawiania prób
import random
from functools import wraps
def retry(times=3):
def dec(func):
@wraps(func)
def wrapper(*a, **kw):
for i in range(times):
try: return func(*a, **kw)
except Exception as e:
if i==times-1: raise
return wrapper
return dec
@retry(3)
def flaky():
if random.random()<0.7: raise ValueError
return 'ok'
try: print(flaky())
except ValueError: print('failed')Dobre praktyki dotyczące dekoratorów
from functools import wraps
def validate_positive(func):
@wraps(func)
def wrapper(x, *a, **kw):
if x <= 0: raise ValueError(f'{x} must be positive')
return func(x, *a, **kw)
return wrapper
@validate_positive
def sqrt(x): return x**0.5
print(sqrt(9))Szybkie sprawdzenie
Podsumowanie
Proszę kontynuować
Często zadawane pytania
Czy lekcja „Pisanie własnych dekoratorów” jest bezpłatna?
Tak — pełny tekst „Pisanie własnych dekoratorów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pisanie własnych dekoratorów”?
Proszę tworzyć dekoratory za pomocą funkcji opakowujących i functools.wraps. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Pisanie własnych dekoratorów”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Funkcje jako obiekty pierwszej klasy
- Pisanie własnych dekoratorów
- Dekorator @property
- @classmethod i @staticmethod