CodeGym /Kurslar /Python SELF AZ /Bütün dekoratorların gücü

Bütün dekoratorların gücü

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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))
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION