Decorator, bir fonksiyonu başka bir fonksiyonla sarıp davranışını değiştirmenin kısa yoludur.
@decorator yazmak, fonksiyon = decorator(fonksiyon) yazmakla aynıdır.
Fonksiyonun kodunu değiştirmeden loglama, cache, yetkilendirme gibi eklemeler yapmak için kullanılır.
def selamla_decorator(func):
def wrapper():
print("Önce")
func()
print("Sonra")
return wrapper
@selamla_decorator
def selamla():
print("Merhaba!")
selamla()
Sonuç:
Önce
Merhaba!
Sonra
Argümanlı decoratorler için decoratorler iç içe kullanılmalıdır:
def tekrarla(kere):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(kere):
func(*args, **kwargs)
return wrapper
return decorator
@tekrarla(3)
def selam(isim):
print(f"Selam {isim}")
selam("Mehmet")
Sonuç:
Selam Mehmet
Selam Mehmet
Selam Mehmet
Not: wrapper üstüne @functools.wraps(func) koymayı unutmayın, yoksa fonksiyonun adı kaybolur.
Hazır decorator'lar örnek şunlardır: @staticmethod, @classmethod, @property, @lru_cache.
Tek cümleyle: Decorator, "al bu fonksiyonu, bana değiştirilmiş halini ver" demenin pythonvari şeklidir.