decorators

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Aug 24, 2020

 

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

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 های متعدد داشته باشد.

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
4دیدگاه
  • EBHAM
    1 year, 7 months ago

    سلام آقای بیگدلی خسته نباشید
    ممنون از آموزش های مفیدتون
    بنده چند مدت توی این تابع گیرم و درکش نمیکنم
    تو این تابعی که نوشتید
    چرا وقتی توی تابع دوم پرانتز های جلوی funرو حذف میکنم کد به صورت خالی اجرا میشه
    ممنون میشم یه توضیح بدید که اون پرانتزا کارش چیه و چه کاری رو برای این تابع انجام میده و چرا وقتی از پراتنتز جلوش استفاده میشه به صورت یک پرینت در میاد

    • علی بیگدلی
      1 year, 7 months ago

      پرانتز بعد از اسم یک تابع حکم اجرایی کردن تابع رو داره در غیر اینصورت شما دارید به یک attribute نگاه می کنین که فقط فضای حافظس و نه چیز دیگه وقتی پرانتز جلوش میاد عملکرد هایی که درش اشاره شده رو اجرا می کنه

  • Al Tah
    2 years, 4 months ago

    سلام
    اگر بخوايم به جاي hello world از كاربر ورودي بگيريم يه عدد يا متن, بايد چيكار كنيم؟

    • علی بیگدلی
      2 years, 4 months ago

      مشخصا توی ورودی های تابع این موضوع صحبت شده عزیز لطفا به بخش توابع و کار با آن ها مراجعه کنین