5.1 Dekoratorlarla tanışlıq
Dekoratorlar — bu funksiyalardır ki, başqa bir funksiyanı arqument kimi qəbul edir və yeni bir funksiya qaytarır, beləliklə ilkin funksiyanın davranışını dəyişdirir və ya genişləndirir. Dekoratorlar kodun oxunaqlığını və təkrar istifadəsini artırmaq üçün istifadə olunur.
Dekoratorlar funksiyaların və ya metodların davranışını onların ilkin kodunu dəyişmədən modifikasiya etməyə imkan verir. Buna görə də, onlar funksionallıq əlavə etmək, loglama, icazə nəzarəti kimi bir çox məqsədlər üçün geniş istifadə olunur.
Python-da dekoratorların sintaksisi @ simvolundan istifadəni nəzərdə tutur və bu simvol dekoratorun adından əvvəl, funksiyanın təyini üzərinə yerləşdirilir.
@decorator
def my_function():
pass
Bu, aşağıdakı kodla ekvivalentdir:
def my_function():
pass
my_function = decorator(my_function)
Diqqətlə düşünün, burada nə baş verir: biz my_function
funksiyasını elan edirik, amma sonra onu decorator
funksiyası ilə əvəz edirik, hansına ki bizim funksiyamız arqument olaraq ötürülür. decorator
funksiyası bizim funksiyanı öz seçimindən asılı olaraq çağıra bilər.
5.2 Sadə dekorator yaratmaq
Gəlin funksiyanı çağırmazdan əvvəl və sonra mesaj verən sadə bir dekoratora baxaq.
def my_decorator(func):
def wrapper():
print("Funksiyanı çağırmazdan əvvəl")
func()
print("Funksiyanı çağırdıqdan sonra")
return wrapper
@my_decorator
def say_hello():
print("Salam!")
say_hello()
İzahat
Dekorator (my_decorator)
: Bu funksiya func
funksiyasını arqument olaraq qəbul edir və yeni bir wrapper
funksiyasını qaytarır ki, bu da func
-ı çağırır və onun çağırışından əvvəl və sonra əlavə davranış əlavə edir.
Dekoratorla funksiya (say_hello)
: say_hello
funksiyası my_decorator
dekoratoru ilə bükülüb və bu da onun çağırışı zamanı əlavə davranış əlavə edir.
Çıxış:
# Funksiyanı çağırmazdan əvvəl
Salam!
# Funksiyanı çağırdıqdan sonra
5.3 Argumentlərlə dekoratorlar
Dekoratorlar argumentlər qəbul edə bilər, bu da onların davranışını çevik şəkildə tənzimləməyə imkan verir.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Salam, {name}!")
say_hello("Alice")
İzah
Argumentlərlə dekorator (repeat)
: Bu funksiya num_times
argumentini qəbul edir və decorator_repeat
dekoratorunu qaytarır.
Dekorator (decorator_repeat)
: Bu dekorator func
funksiyasını qəbul edir və yeni wrapper
funksiyasını qaytarır, hansı ki, func
funksiyasını num_times
qədər çağırır.
Dekoratorla birlikdə funksiya (say_hello)
: say_hello
funksiyası üç dəfə çağırılır, repeat
dekoratoru sayəsində.
Nəticə:
Salam, Alice!
Salam, Alice!
Salam, Alice!
GO TO FULL VERSION