You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lessons/l21.rst
+44Lines changed: 44 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -745,6 +745,50 @@ property@
745
745
.. tip::
746
746
747
747
از ``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
+
classSampleContextManager:
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) یا...
0 commit comments