- Dekoratorları Anlamaq
- Funksiyanın Sarılması və Artırılması
- functools.wraps istifadə edərək
- Argümentləri olan Funksiyaların Dekorasiya Edilməsi
- Dekoratorların Praktik Tətbiqləri
- Xülasə
- Tapşırıqlar
Dekoratorlar digər funksiyaların və ya metodların davranışını dəyişdirən funksiyalardır. Onlar başqa bir funksiyanı sarmağa və onun davranışını daimi olaraq dəyişdirmədən genişləndirməyə imkan verir.
Əsas dekorator funksiyası başqa bir funksiyanı arqument kimi qəbul edir, sarıcı funksiyanı təyin edir və sarıcı funksiyanı qaytarır.
def decorator(func):
def wrapper():
print("Başla")
func()
print("Bitir")
return wrapper
@decorator
def ordinary():
print("Adi Funksiya")
ordinary()
Nəticə:
Başla
Adi Funksiya
Bitir
İzah: decorator
funksiyası ordinary
funksiyasını sarır, orijinal funksiya çağırışından əvvəl və sonra davranış əlavə edir.
Dekoratorlar funksiyaların davranışını artırmaq üçün istifadə edilə bilər, məsələn, loglama, vaxt ölçmə və ya giriş nəzarəti əlavə etmək.
import time
def timer(func):
def wrapper():
t1 = time.time()
print("Başla")
func()
print("Bitir")
t2 = time.time()
res = round((t2 - t1) * 1000)
print(f"{func.__name__} {res} millisekundda icra edildi")
return wrapper
@timer
def task():
time.sleep(3)
task()
Nəticə:
Başla
Bitir
task 3000 millisekundda icra edildi
İzah: timer
dekoratoru task
funksiyasının icra vaxtını ölçür.
functools.wraps
dekoratoru, dekorasiya edilmiş funksiyanın orijinal metadatasını qorumaq üçün istifadə olunur.
import functools
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("Əvvəl")
res = func(*args, **kwargs)
print("Sonra")
return res
return wrapper
@decorator
def add(x, y):
"""İki ədədi toplayır."""
return x + y
print(add(5, y=5))
print(add.__name__)
print(add.__doc__)
Nəticə:
Əvvəl
Sonra
10
add
İki ədədi toplayır.
İzah: functools.wraps
dekoratoru add
funksiyasının orijinal adını və docstringini saxlayır.
Dekoratorlar *args
və **kwargs
istifadə edərək argümentləri olan funksiyaları da idarə edə bilər.
def decorator(func):
def wrapper(*args, **kwargs):
print("Əvvəl")
res = func(*args, **kwargs)
print("Sonra")
return res
return wrapper
@decorator
def add(x, y):
return x + y
print(add(5, y=5))
Nəticə:
Əvvəl
Sonra
10
İzah: decorator
funksiyası add
funksiyasını sarır və hər hansı sayda mövqe və açar söz arqumentlərini idarə etməyə imkan verir.
Dekoratorların loglama, giriş nəzarəti və yaddaşda saxlama kimi bir çox praktik tətbiqləri var.
def log(func):
def wrapper(*args, **kwargs):
print(f"{func.__name__} çağırılır {args} və {kwargs} ilə")
return func(*args, **kwargs)
return wrapper
@log
def multiply(x, y):
return x * y
print(multiply(3, 4))
Nəticə:
multiply çağırılır (3, 4) və {} ilə
12
İzah: log
dekoratoru funksiyanın çağırışını və onun arqumentlərini loglayır.
def requires_auth(func):
def wrapper(*args, **kwargs):
if not kwargs.get('authenticated', False):
print("Giriş tələb olunur")
return
return func(*args, **kwargs)
return wrapper
@requires_auth
def get_data(*args, **kwargs):
return "Həssas məlumatlar"
print(get_data(authenticated=True))
print(get_data(authenticated=False))
Nəticə:
Həssas məlumatlar
Giriş tələb olunur
İzah: requires_auth
dekoratoru istifadəçinin autentifikasiyasını yoxlayır və get_data
funksiyasına girişə icazə verir.
Bu fəsildə dekoratorları, dekoratorları anlamaq, funksiyanın sarılması və artırılması, functools.wraps
istifadə edərək, argümentləri olan funksiyaların dekorasiya edilməsi və dekoratorların praktik tətbiqləri haqqında məlumat verdik.
- Funksiyanın icra vaxtını loglayan dekorator yazın.
- İstifadəçinin funksiyaya giriş icazəsini yoxlayan dekorator yazın.
- Funksiyanın nəticələrini yaddaşda saxlayaraq performansı artıran dekorator yazın.
- Uğursuz ola biləcək funksiyaya təkrar mexanizmi əlavə edən dekorator yazın.