decorators

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1402/05/03
  • تعداد بازدید: 149

دکوراتورها راهی برای تغییر عملکرد با استفاده از سایر توابع ارائه می کنند. این کارکرد زمانی ایده آل است که شما نیاز به گسترش عملکرد توابعی دارید که شما نمی خواهید آن ها را تغییر دهید. مثال:

def decor(func):
  def wrap():
    print("============")
    func()
    print("============")
  return wrap

def print_text():
  print("Hello world!")

decorated = decor(print_text)
decorated()

ما یک تابع را به نام دکور تعریف کردیم که دارای یک پارامتر واحد است. در داخل دکور، ما یک تابع توریع شده را با نام wrap تعریف کردیم. تابع Warp یک رشته را چاپ می کند،و سپس func () را فراخوانی می کند و یک رشته دیگر را چاپ می کند. تابع دکور تابع warp را به عنوان نتیجه آن باز می گرداند. می توان گفت که متغیر تزئین شده یک نسخه تزئینی print_text است - print_text به همراه یک نوشته دیگر. در حقیقت، اگر ما یک دکور مفید بنویسیم، ممکن است بخواهیم متن print_text را با نسخه دکور شده جایگزین کنیم، بنابراین ما همیشه نسخه plus something را از print_text در اختیارمان خواهیم داشت. این کار با تخصیص مجدد متغیری که شامل تابع ما است انجام می شود:

 

print_text = decor(print_text)
print_text()

نکته:حالا print_text مربوط به نسخه تزئین شده ما است. در مثال قبلی ما عملمان را با جایگزینی متغیر حاوی تابع با یک نسخه پیچیده دکور کردیم.

def print_text():
  print("Hello world!")

print_text = decor(print_text)

این الگو می تواند در هر زمان مورد استفاده قرار گیرد تا هر تابع را تعویض کند. پایتون با پیش آزمون تعریف تابع با نام دکوراتور و نماد @، پشتیبانی می کند تا یک تابع را در دکوراتور تعبیه کند. اگر ما یک تابع را تعریف می کنیم، می توانیم آن را با نماد @ مانند "دکور" کنیم:

@decor
def print_text():
  print("Hello world!")

این نتیجه همانند کد بالا خواهد بود. نکته: یک تابع تک می تواند decoration های متعدد داشته باشد.