Skip to content

Latest commit

 

History

History
225 lines (162 loc) · 5.29 KB

README.md

File metadata and controls

225 lines (162 loc) · 5.29 KB

Fəsil 13: Dekoratorlar

Mündəricat

Dekoratorları Anlamaq

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

Ə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.

Funksiyanın Sarılması və Artırılması

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.

Nümunə: Funksiyanın Vaxtını Ölçmə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 istifadə edərək

functools.wraps dekoratoru, dekorasiya edilmiş funksiyanın orijinal metadatasını qorumaq üçün istifadə olunur.

Nümunə: Metadatanı Qorumaq

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.

Argümentləri olan Funksiyaların Dekorasiya Edilməsi

Dekoratorlar *args**kwargs istifadə edərək argümentləri olan funksiyaları da idarə edə bilər.

Nümunə: Argümentləri olan Funksiyanı Dekorasiya Etmək

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 Praktik Tətbiqləri

Dekoratorların loglama, giriş nəzarəti və yaddaşda saxlama kimi bir çox praktik tətbiqləri var.

Nümunə: Loglama

def log(func):
    def wrapper(*args, **kwargs):
        print(f"{func.__name__} çağırılır {args}{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.

Nümunə: Giriş Nəzarəti

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.

Xülasə

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.

Tapşırıqlar

  1. Funksiyanın icra vaxtını loglayan dekorator yazın.
  2. İstifadəçinin funksiyaya giriş icazəsini yoxlayan dekorator yazın.
  3. Funksiyanın nəticələrini yaddaşda saxlayaraq performansı artıran dekorator yazın.
  4. Uğursuz ola biləcək funksiyaya təkrar mexanizmi əlavə edən dekorator yazın.

Növbəti Fəsil: PIP ilə Paket İdarəetməsi