دکوراتورها می توانند رفتار را اصلاح کنند
اکنون که کمی با نحو دکوراتور آشنا شدید، بیایید دکوراتور دیگری بنویسید که در واقع کاری انجام می دهد و آن را اصلاح می کند در اینجا یک دکوراتور کمی پیچیده تر است که نتیجه را تبدیل می کند تابع تزئین شده به حروف بزرگ:def uppercase(func): رفتار تابع تزئین شده def wrapper(): modified_result = original_result.upper() return modified_result return wrapperبه جای برگرداندن تابع ورودی مانند دکور تهی، این دکوراتور با حروف بزرگ یک تابع جدید را در جریان تعریف می کند. closure) و از آن برای بسته بندی تابع ورودی به منظور اصلاح آن استفاده می کند رفتار در زمان تماس original_result = func() بسته شدن لفاف به عملکرد ورودی تزئین نشده دسترسی دارد و تابع. (از نظر فنی، حتی نیازی به فراخوانی تابع ورودی ندارد اصلا.) اجرای کد اضافی قبل و بعد از فراخوانی ورودی رایگان است توجه داشته باشید که چگونه، تا به حال، تابع تزئین شده هرگز اجرا نشده است. در واقع فراخوانی تابع ورودی در این مرحله باعث نمی شود هر حسی داشته باشید – شما می خواهید که دکوراتور بتواند رفتار را اصلاح کند ممکن است بخواهید اجازه دهید که برای یک یا دو دقیقه غرق شود. من می دانم چگونه ممکن است این چیزها پیچیده به نظر برسد، اما ما با هم آن را حل خواهیم کرد، من وعده. تابع ورودی آن زمانی که در نهایت فراخوانی می شود. وقت آن است که دکوراتور بزرگ را در عمل ببینیم. چه اتفاقی می افتد اگر شما تابع سلام اصلی را با آن تزئین کنید؟def greet(): @uppercase return ‘Hello!’ ‘HELLO!’امیدوارم این نتیجه ای بود که انتظار داشتید. بیایید نگاهی دقیق تر به چه چیزی بیندازیم فقط اینجا اتفاق افتاد برخلاف null_decorator، decora tor ما با حروف بزرگ یک شی تابع متفاوت را هنگامی که یک تابع را تزئین می کند، برمی گرداند:>>> greet >>> greet() <function greet at 0x10e9f0950> <function greet at 0x10e9f0950> >>> null_decorator(greet) <function uppercase.<locals>.wrapper at 0x76da02f28>و همانطور که قبلا دیدید، برای اصلاح آن باید این کار را انجام دهد رفتار تابع تزئین شده هنگامی که در نهایت فراخوانی می شود. را دکوراتور حروف بزرگ خود یک تابع است. و تنها راه نفوذ >>> uppercase(greet) wrap) تابع ورودی با یک بسته. “رفتار آینده” یک تابع ورودی که تزئین می کند جایگزین کردن (یا به همین دلیل است که حروف بزرگ یک تابع دیگر (بسته شدن) را تعریف می کند و برمی گرداند که می تواند در زمان دیگری فراخوانی شود، ورودی اصلی را اجرا کنید. دکوراتورها رفتار قابل فراخوانی را از طریق یک لفاف بسته میکنند تا مجبور نباشید برای همیشه نسخه اصلی را تغییر دهید. قابلیت فراخوانی اصلی به طور دائم تغییر نمی کند – رفتار آن فقط تغییر می کند هنگام تزئین عملکرد، و نتیجه آن را اصلاح کنید. این به شما اجازه میدهد تا به بلوکهای ساختمانی قابل استفاده مجدد، مانند ورود به سیستم و غیره بپردازید ابزار دقیق، به توابع و کلاس های موجود. این ویژگی دکوراتورها را چنان قدرتمند در پایتون می کند که اغلب در پایتون از آن استفاده می شود کتابخانه استاندارد و در بسته های شخص ثالث.
قوانین ارسال دیدگاه در سایت