فهرست سرفصل‌های Python
خانه (Home) مقدمه (Introduction) شروع به کار (Getting Started) سینتکس (Syntax) کامنت ها (Comments) متغیرها (Variables) متغیرها - نام گذاری (Variables Names) متغیرها - اختصاص چندین مقدار (Assign Multiple Values) متغیرها - خروجی (Output Variables) متغیرها - سراسری (Global Variables) انواع داده ها (Data Types) اعداد (Numbers) تبدیل (Casting) رشته ها (Strings) رشته ها - برش (Slicing Strings) رشته ها - اصلاح (Modify Strings) رشته ها - چسباندن (String Concatenation) رشته ها - قالب بندی (Format - Strings) رشته ها - کاراکتر فرار (Escape Characters) رشته ها - متدها (String Methods) بولین ها (Booleans) عملگرها (Operators) لیست ها (Lists) لیست ها - دسترسی به آیتم (Access List Items) لیست ها - تغییر آیتم (Change List Items) لیست ها - اضافه کردن آیتم (Add List Items) لیست ها - حذف کردن آیتم (Remove List Items) لیست ها - حلقه (Loop Lists) لیست ها - فهرست سازی فشرده (List Comprehension) لیست ها - مرتب سازی (Sort Lists) لیست ها - کپی (Copy Lists) لیست ها - چسباندن (Join Lists) لیست ها - متدها (List Methods) تاپل ها (Tuples) تاپل ها - دسترسی به آیتم ها (Access Tuple Items) تاپل ها - به روز رسانی (Update Tuples) تاپل ها - باز کردن (Unpack Tuples) تاپل ها - حلقه (Loop Tuples) تاپل ها - چسباندن (Join Tuples) تاپل ها - متدها (Tuple Methods) مجموعه ها - (Sets) مجموعه ها - دسترسی به آیتم ها (Access Set Items) مجموعه ها - اضافه کردن آیتم (Add Set Items) مجموعه ها - حذف کردن آیتم ها (Remove Set Items) مجموعه ها - حلقه (Loop Sets) مجموعه ها - چسباندن (Join Sets) مجموعه ها - یخ زده (Frozen Sets) مجموعه ها - متدها (Set Methods) دیکشنری ها (Dictionaries) دیکشنری ها - دسترسی به آیتم ها (Access Dictionary Items) دیکشنری ها - تغییر آیتم ها (Change Dictionary Items) دیکشنری ها - اضافه کردن آیتم (Add Dictionary Items) دیکشنری ها - حذف کردن آیتم (Remove Dictionary Items) دیکشنری ها - حلقه (Loop Dictionaries) دیکشنری ها - کپی (Copy Dictionaries) دیکشنری ها - تو در تو (Nested Dictionaries) دیکشنری ها - متدها (Dictionary Methods) شرط ها (If...Else) مطابقت (Match) حلقه While (While Loops) حلقه For (For Loops) توابع (Functions) دکوراتورها (Decorators) محدوده (Range) لامبدا (Lambda) آرایه ها (Arrays) شی گرایی (OOP) کلاس ها و اشیاء (Classes and Objects) وراثت (Inheritance) تکرارکننده ها (Iterators) چندریختی (Polymorphism) محدوده (Scope) ماژول ها (Modules) تاریخ و زمان (Datetime) ریاضی (Math) جی سون (JSON) عبارت منظم (Regex) پیپ (PIP) استثنا (Try...Except) قالب بندی رشته ها (String Formatting) خالی (None) ورودی از کاربر (User Input) محیط مجازی (Virtual Enviroment)
PYTHON

Python — دکوراتورها (Decorators)

آخرین بروزرسانی: 1404/07/05

دکوراتورها (Decorators)

دکوراتور (Decorator) در پایتون ابزاری است که امکان افزودن رفتار اضافه به یک تابع را بدون تغییر در کد اصلی آن فراهم می کند. دکوراتور یک تابع است که تابع دیگر را به عنوان ورودی می گیرد و خروجی آن یک تابع جدید است.

نمونه ساده دکوراتور

ابتدا دکوراتور تعریف می شود، سپس با قرار دادن @decorator_name بالای تابع، اعمال می گردد:

def changecase(func):
    def myinner():
        return func().upper()
    return myinner

@changecase
def myfunction():
    return "Hello Sally"

print(myfunction())

در این مثال، تابع myfunction با دکوراتور changecase تغییر رفتار داده است.

کاربرد روی چند تابع

می توانید یک دکوراتور را روی چند تابع مختلف اعمال کنید:

@changecase
def myfunction():
    return "Hello Sally"

@changecase
def otherfunction():
    return "I am speed!"

print(myfunction())
print(otherfunction())

تابع تزئین شده با آرگومان

اگر تابع شما نیاز به آرگومان دارد، کافی است آن ها را به تابع داخلی پاس دهید:

def changecase(func):
    def myinner(x):
        return func(x).upper()
    return myinner

@changecase
def myfunction(name):
    return "Hello " + name

print(myfunction("John"))

استفاده از *args و **kwargs

برای پشتیبانی از تعداد نامشخص آرگومان ها، از *args و **kwargs استفاده کنید:

def changecase(func):
    def myinner(*args, **kwargs):
        return func(*args, **kwargs).upper()
    return myinner

@changecase
def myfunction(name):
    return "Hello " + name

print(myfunction("John"))

دکوراتور با آرگومان

دکوراتورها می توانند خودشان نیز آرگومان دریافت کنند:

def changecase(n):
    def decorator(func):
        def myinner():
            return func().upper() if n != 1 else func().lower()
        return myinner
    return decorator

@changecase(1)
def myfunction():
    return "Hello Linus"

print(myfunction())

استفاده از چند دکوراتور

می توان چند دکوراتور را به ترتیب روی یک تابع اعمال کرد. ترتیب قرارگیری آن ها اهمیت دارد:

def changecase(func):
    def myinner():
        return func().upper()
    return myinner

def addgreeting(func):
    def myinner():
        return "Hello " + func() + " Have a good day!"
    return myinner

@changecase
@addgreeting
def myfunction():
    return "Tobias"

print(myfunction())

حفظ اطلاعات متادیتا

زمانی که تابعی تزئین می شود، ویژگی هایی مانند __name__ تغییر می کند. برای جلوگیری از این مشکل از functools.wraps استفاده می کنیم:

import functools

def changecase(func):
    @functools.wraps(func)
    def myinner():
        return func().upper()
    return myinner

@changecase
def myfunction():
    return "Have a great day!"

print(myfunction.__name__)

ادامه یادگیری

برای یادگیری بیشتر درباره توابع در پایتون یا آشنایی با تابع range مطالعه کنید.