Python Dekoratorlari: Boshlang'ichlar Uchun To'liq Qo'llanma
Muallif: Javohir Abdullayev · · Python

Python Dekoratorlari Nima va Nega Kerak?
Python dasturlash tilida kod yozishni boshlaganingizda tez-tez @property, @login_required (Django) yoki @dp.message() (Aiogram) kabi qatorlarga duch kelasiz. Bu belgilar bilan boshlanadigan tuzilmalar dekoratorlar (decorators) deb ataladi. Ko'plab boshlang'ich dasturchilar uchun bu mavzu biroz murakkab va sirli tuyulishi mumkin. Aslida esa dekorator — mavjud funksiya kodini o'zgartirmasdan uning imkoniyatlarini kengaytirish (kengaytirilgan xatti-harakat qo'shish) imkonini beruvchi juda qulay vositadir.
Ushbu qo'llanmada biz dekoratorlarning ishlash mexanizmini bosqichma-bosqich, eng oddiy tushunchalardan boshlab amaliy misollar bilan ko'rib chiqamiz.
1. Funksiya — Birinchi Darajali Obyekt (First-Class Citizen)
Dekoratorlarni to'liq tushunish uchun avvalo Python-da funksiyalar qanday ishlashini bilish zarur. Python tilida barcha funksiyalar obyektdir. Bu shuni anglatadiki, siz funksiyani:
- O'zgaruvchiga tenglashingiz;
- Boshqa funksiyaga argument sifatida uzatishingiz;
- Boshqa funksiya ichidan natija sifatida qaytarishingiz mumkin.
Keling, oddiy misolni ko'ramiz:
def salom_ber(ism):
return f"Assalomu alaykum, {ism}!"
# Funksiyani o'zgaruvchiga yuklaymiz
xabar = salom_ber
print(xabar("Ali")) # Natija: Assalomu alaykum, Ali!2. Ichma-ich Funksiyalar va Funksiyani Qaytarish
Funksiya ichida boshqa funksiyani yaratish va uni tashqariga qaytarish mumkin. Bu dekoratorlarning poydevori hisoblanadi:
def tashqi_funksiya():
def ichki_funksiya():
return "Ichki funksiyadan salom!"
return ichki_funksiya
yangi_funksiya = tashqi_funksiya()
print(yangi_funksiya()) # Natija: Ichki funksiyadan salom!3. Ilk Oddiy Dekoratorimizni Yaratamiz
Dekorator — bu boshqa bir funksiyani argument sifatida qabul qilib, uning ustiga qo'shimcha logika qo'shuvchi va yangilangan funksiyani qaytaruvchi funksiyadir.
def mening_dekoratorim(asosiy_funksiya):
def wrapper():
print("Funksiya ishga tushishidan oldin bajariladigan kod.")
asosiy_funksiya()
print("Funksiya ishlab bo'lgach bajariladigan kod.")
return wrapper
def oddiy_salom():
print("Salom, dunyo!")
# Dekoratsiyalash usuli:
bezatilgan_salom = mening_dekoratorim(oddiy_salom)
bezatilgan_salom()Sintaktik Shakar: @ Belgisi
Python-da qo'lda bezatilgan_salom = mening_dekoratorim(oddiy_salom) deb yozib o'tirmaslik uchun maxsus @ belgisi yaratilgan:
@mening_dekoratorim
def oddiy_salom():
print("Salom, dunyo!")
oddiy_salom()Har ikki usul mutlaqo bir xil natija beradi, biroq @ sintaksisi ancha o'qishli va ixchamdir.
4. Argument Qabul Qiluvchi Funksiyalarni Bezash
Real loyihalarda funksiyalar turli xil argumentlar qabul qiladi. Wrapper funksiyamiz har qanday miqdordagi argumentlarni qabul qila olishi uchun *args va **kwargs ishlatamiz:
def xabar_dekoratori(func):
def wrapper(*args, **kwargs):
print(f"[LOG] {func.__name__} funksiyasi ishga tushirildi.")
natija = func(*args, **kwargs)
print(f"[LOG] Funksiya o'z ishini yakunladi.")
return natija
return wrapper
@xabar_dekoratori
def hisobla(a, b):
return a + b
javob = hisobla(10, 25)
print(f"Natija: {javob}")5. Real Amaliy Misol: Bajarilish Vaqtini O'lchash
Dasturlashda funksiyalarning qancha vaqt ichida bajarilishini o'lchash ko'p talab qilinadi. Buni har bir funksiyaga alohida yozib chiqmasdan, bitta umumiy dekorator orqali hal qilamiz:
import time
def vaqtni_olchash(func):
def wrapper(*args, **kwargs):
boshlanish = time.time()
natija = func(*args, **kwargs)
tugash = time.time()
sarflangan_vaqt = tugash - boshlanish
print(f"{func.__name__} funksiyasi {sarflangan_vaqt:.4f} soniyada bajarildi.")
return natija
return wrapper
@vaqtni_olchash
def katta_ro‘yxat_yaratish():
return [x ** 2 for x in range(1_000_000)]
katta_ro‘yxat_yaratish()6. functools.wraps Nega Kerak?
Funksiyani dekorator bilan o'raganimizda, asl funksiyaning metadata ma'lumotlari (nomi, docstring tavsifi) wrapper funksiya nomi bilan almashib qoladi. Buning oldini olish uchun Python standart kutubxonasidagi functools.wraps yordamga keladi:
from functools import wraps
def xavfsiz_dekorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""Bu wrapper funksiya."""
return func(*args, **kwargs)
return wrapper
@xavfsiz_dekorator
def foydalanuvchi_info():
"""Bu funksiya foydalanuvchi haqida ma'lumot beradi."""
pass
print(foydalanuvchi_info.__name__) # foydalanuvchi_info
print(foydalanuvchi_info.__doc__) # Bu funksiya foydalanuvchi haqida ma'lumot beradi.Har doim dekorator yozayotganda @wraps(func) ishlatishni odat qiling. Bu kelgusida loyihani debug qilishda va testlar yozishda adashishlarning oldini oladi.
Xulosa
Python dekoratorlari — kodni toza saqlash (DRY prinsipi), loglash, xavfsizlikni tekshirish va autentifikatsiya kabi takrorlanuvchi vazifalarni yagona joyda boshqarish uchun ajoyib yechimdir. Siz ushbu qo'llanmadagi asoslarni o'rganib olsangiz, Django, Flask, FastAPI yoki Aiogram kabi mashhur kutubxonalarda kod yozish jarayoni ancha sodda va tushunarli bo'ladi.
Teglar: #Python #Dekoratorlar #Backend #Dasturlash Asoslari