Skip to content

Commit aae3cc0

Browse files
author
Saeid
committed
l21: add context manager
1 parent e4046f8 commit aae3cc0

2 files changed

Lines changed: 44 additions & 3 deletions

File tree

lessons/l21.rst

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,50 @@ property@
745745
.. tip::
746746

747747
از ``property@`` تنها برای Instance Attributeها می‌توان استفاده کرد.
748+
749+
750+
Context Manager و دستور ``with/as``
751+
------------------------------------------
752+
753+
یکی دیگر از قابلیت‌های کمتر شناخته شده در زبان برنامه‌نویسی پایتون، Context Manager می‌باشد [`اسناد پایتون <http://docs.python.org/3/library/stdtypes.html#typecontextmanager>`__]. با این حال اکثر برنامه‌نویسان پایتون به صورت مداوم از آن بهره می‌گیرند. اگر درس دهم را به یاد داشته باشیم، از دستور ``with/as`` برای کار با فایل‌ها در پایتون استفاده می‌کردیم و شاهد راحتی و زیبایی کارها نسبت به قبل بودیم. در آن زمان تنها اشاره شد که شی فایل پایتون را می‌توان با دستور ``with/as`` استفاده کرد چون این شی از قابلیت Context Manager پشتیبانی می‌کند.
754+
755+
به صورت کلی Context Manager در زبان برنامه‌نویسی پایتون قابلیتی برای مدیرت منابع (فایل‌ها، دیتابیس و...) می‌باشد، منابعی که کار کردن با آن‌ها همواره نیازمند عملیات‌ ثابتی همچون باز (Open) و بسته (Close) کردن هستند. در این بخش می‌خواهیم به بررسی چگونگی ایجاد یک کلاس به همراه قابلیت Context Manager بپردازیم که در نهایت از اشیای آن بتوانیم در کنار دستور ``with/as`` استفاده نماییم.
756+
757+
اجازه دهید بار دیگر ساختار دستور ``with/as`` را بررسی نماییم::
758+
759+
with context_expression [as target]:
760+
with_statement_body
761+
762+
در این ساختار بخش ``as`` اختیاری بوده و تنها زمانی که در داخل بدنه دستور ``with`` به شی ``context_expression`` نیاز داشته باشیم، استفاده می‌گردد؛ در این صورت یک ارجاع از شی مذکور به نام دلخواه ``target`` ایجاد و در سترس قرار می‌گیرد. ``context_expression`` نیز معرف یک شی‌ای است که توانایی مدیریت یا handle کردن دو وضعیت «ورود به» (entry into) و «خروج از» (exit from) را داشته باشد. برای ایجاد همچین شی‌ای می‌بایست دو متد خاص ``__enter__`` [`اسناد پایتون <https://docs.python.domainunion.de/3/reference/datamodel.html#object.__enter__>`__] و ``__exit__`` [`اسناد پایتون <https://docs.python.domainunion.de/3/reference/datamodel.html#object.__exit__>`__] را در کلاس مورد نظر خود پیاده‌سازی کنیم:
763+
764+
.. code-block:: python
765+
:linenos:
766+
767+
class SampleContextManager:
768+
def __enter__(self):
769+
print('---> Entered into context manager!')
770+
771+
def __exit__(self, *args):
772+
print('<--- Exiting from context manager!')
773+
774+
775+
with SampleContextManager():
776+
print('Inside context manager!')
777+
778+
::
779+
780+
---> Entered into context manager!
781+
Inside context manager!
782+
<--- Exiting from context manager!
783+
784+
همانطوری که از خروجی نمونه کد بالا قابل مشاهده می‌باشد، در هنگام اجرای دستور ``with``، ابتدا متد ``__enter__`` از شی Context Manager و سپس دستورات داخل بدنه دستور ``with`` و در نهایت نیز متد ``__exit__`` از شی Context Manager اجرا می‌گردد.
785+
786+
787+
اگر بخواهیم کمی عمیق‌تر به ماجرا نگاه کنیم:
788+
789+
* اجرای متد ``__enter__`` زمانی است که خط اجرای برنامه به اصطلاح می‌خواهد وارد runtime context شود و خروجی این متد می‌بایست شی‌ای باشد که می‌خواهیم در طول اجرای دستور ``with`` یا به اصطلاح context، با آن کار کنیم. البته خروجی می‌تواند ``None`` باشد ولی باید توجه داشت که خروجی این متد است که توسط دستور ``as`` به نام ``target`` ارجاع می‌خورد!
790+
791+
* اجرای متد ``__exit__`` زمانی است که کار یا اجرای context به پایان رسیده است. این متد در واقع فرصتی برای تمیزکاری یا به اصطلاح clean up کردن آثار اجرای context می‌باشد. به مانند پاک کردن فایل‌هایی که موقت ایجاد شده‌اند، حذف اشیای اضافی باقی‌مانده یا انجام عمل بستن یک فایل یا پایان دادن یک ارتباط (Connection) یا...
748792

749793
|
750794

lessons/l24.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,6 @@
236236
در زبان‌برنامه‌نویسی پایتون پیشنهاد می‌شود که اگر هدف از ایجاد Exception نمایش یک خطا باشد، در انتهای نام کلاس از واژه Error استفاده گردد.
237237

238238

239-
Context Manager و ``with``
240-
~~~~~~~~~~~~~~~~~~~~~~~~~~~
241-
242239

243240
ماژول warnings
244241
~~~~~~~~~~~~~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)