6.1 Sinif metodları üçün dekoratorlar
Dekoratorlar həmçinin sinif metodları üçün istifadə edilə bilər. Əsas odur ki, sinif metodları üçün self
və ya cls
arqumentlərini düzgün ötürmək lazımdır.
Siniflərin iş prinsipini hələ müzakirə etməsək də, dekoratorların bu cür imkanları olduğunu bilməyiniz yaxşı olar.
def log_method_call(func):
def wrapper(self, *args, **kwargs):
print(f"Metod çağırışı {func.__name__}")
return func(self, *args, **kwargs)
return wrapper
class MyClass:
@log_method_call
def say_hello(self):
print("Salam MyClass-dan!")
obj = MyClass()
obj.say_hello()
İzah
Dekorator (log_method_call)
: Bu dekorator metod olan func
-ı qəbul edir və yeni wrapper
funksiyasını geri qaytarır. Bu yeni funksiya metod çağırışından əvvəl mesaj göstərir.
Dekorator ilə sinif metodu (say_hello)
: say_hello
metodu log_method_call
dekoratoru ilə əhatə olunur, bu da onun çağırılışı zamanı əlavə davranış təmin edir.
Nəticə:
Metod çağırışı say_hello
Salam MyClass-dan!
6.2 Bir neçə decorator
Bir funksiyaya bir neçə decorator tətbiq edə bilərsiniz, onları bir-birinin üzərinə əlavə edərək. Decorator-lar elan olunma sırası ilə əks istiqamətdə tətbiq edilir.
def decorator1(func):
def wrapper():
print("Dekorator 1")
func()
return wrapper
def decorator2(func):
def wrapper():
print("Dekorator 2")
func()
return wrapper
@decorator1
@decorator2
def say_hello():
print("Salam!")
say_hello()
İzah
Decorator-lar (decorator1 və decorator2)
: Bu decorator-lar öz mesajlarını func
funksiyası çağırılmadan əvvəl əlavə edir.
Decorator-lu funksiya (say_hello)
: say_hello
funksiyası hər iki decorator ilə sarılmışdır. Əvvəlcə decorator2
, sonra isə decorator1
tətbiq edilir.
Nəticə:
# Dekorator 1
# Dekorator 2
Salam!
6.3 Daxili dekoratorlar
Python, statik metodlar, sinif metodları və xüsusiyyətlər kimi standart məsələlər üçün bir neçə daxili dekorator təqdim edir.
@staticmethod
@staticmethod
dekoratoru, sinif nümunəsinə ehtiyac olmadan çağrıla biləcək statik metod yaratmaq üçün istifadə olunur.
class MyClass:
@staticmethod
def static_method():
print("Bu statik metoddur.")
MyClass.static_method()
@classmethod
@classmethod
dekoratoru sinif metodunu yaratmaq üçün istifadə olunur. Bu metod ilk arqument kimi sinfi (nümunəni deyil) qəbul edir.
class MyClass:
@classmethod
def class_method(cls):
print(f"Bu sinif metodudur {cls.__name__}.")
MyClass.class_method()
@property
@property
dekoratoru atributlar üçün getter-lər, setter-lər və deleter-lər yaratmaq üçün istifadə olunur.
class MyClass:
def __init__(self, value):
self.hidden_value = value
@property
def value(self):
return self.hidden_value
@value.setter
def value(self, new_value):
self.hidden_value = new_value
obj = MyClass(10)
print(obj.value) # Çıxış: 10
obj.value = 20
print(obj.value) # Çıxış: 20
Bunlar daxili dekoratorlardır və onların düzgün işləməsini Python interpretatoru təmin edir.
6.4 Dekoratorların istifadəsinə nümunələr
Loglama
Dekoratorlar funksiyaların və metodların çağırışlarını loglamaq üçün istifadə edilə bilər.
def log_call(func):
def wrapper(*args, **kwargs):
print(f"Funksiya {func.__name__} çağırılır {args} argumentləri və {kwargs} ilə")
return func(*args, **kwargs)
return wrapper
@log_call
def add(x, y):
return x + y
print(add(2, 3))
Girişə nəzarət
Dekoratorlar funksiyalara və metodlara giriş üçün nəzarət etmək məqsədilə istifadə edilə bilər.
def require_authentication(func):
def wrapper(*args, **kwargs):
if not args[0].is_authenticated:
raise PermissionError("İstifadəçi autentifikasiya olunmayıb.")
return func(*args, **kwargs)
return wrapper
class User:
def __init__(self, is_authenticated):
self.is_authenticated = is_authenticated
@require_authentication
def view_profile(self):
print("İstifadəçi profili")
user = User(is_authenticated=True)
user.view_profile() # Uğurlu çağırış
user2 = User(is_authenticated=False)
user2.view_profile() # PermissionError: İstifadəçi autentifikasiya olunmayıb.
Keşləmə
Dekoratorlar funksiyaların nəticələrini keşləmək üçün istifadə edilə bilər.
def cache(func):
cached_results = {}
def wrapper(*args):
if args in cached_results:
return cached_results[args]
result = func(*args)
cached_results[args] = result
return result
return wrapper
@cache
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(35))
GO TO FULL VERSION