Skip to content

Commit 2f07a3d

Browse files
author
Saeid
committed
*
1 parent bf81dad commit 2f07a3d

1 file changed

Lines changed: 38 additions & 6 deletions

File tree

lessons/l21.rst

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
.. role:: emoji-size
22

33
.. meta::
4-
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، OOP در پایتون، Decorators در پایتون، Descriptors در پایتون، property@ در پایتون
4+
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، OOP در پایتون، Decorators در پایتون، Descriptors در پایتون، property@ در پایتون، Context Manager در پایتون، دستور with / as
55
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, Decorators, کتابخانه, پایتون, شی گرایی در پایتون, Descriptors,property@
66

77

8-
درس ۲۱: شی گرایی (OOP) در پایتون: __Descriptors ،Decorator ،__slots و property@
8+
درس ۲۱: شی گرایی (OOP) در پایتون: Context Manager ،Descriptors ،Decorator
99
===================================================================================================
1010

1111
.. figure:: /_static/pages/21-python-object-oriented-programming-property-descriptors.jpg
1212
:align: center
13-
:alt: شی گرایی (OOP) در پایتون: __Descriptors ،Decorator ،__slots و property@
13+
:alt: شی گرایی (OOP) در پایتون: __Descriptors ، Context Manager ،Decorator ،__slots و property@
1414

1515
Photo by `Mathyas Kurmann <https://unsplash.com/photos/fb7yNPbT0l8>`__
1616

@@ -752,14 +752,14 @@ Context Manager و دستور ``with/as``
752752

753753
یکی دیگر از قابلیت‌های کمتر شناخته شده در زبان برنامه‌نویسی پایتون، Context Manager می‌باشد [`اسناد پایتون <http://docs.python.org/3/library/stdtypes.html#typecontextmanager>`__]. با این حال اکثر برنامه‌نویسان پایتون به صورت مداوم از آن بهره می‌گیرند. اگر درس دهم را به یاد داشته باشیم، از دستور ``with/as`` برای کار با فایل‌ها در پایتون استفاده می‌کردیم و شاهد راحتی و زیبایی کارها نسبت به قبل بودیم. در آن زمان تنها اشاره شد که شی فایل پایتون را می‌توان با دستور ``with/as`` استفاده کرد چون این شی از قابلیت Context Manager پشتیبانی می‌کند.
754754

755-
به صورت کلی Context Manager در زبان برنامه‌نویسی پایتون قابلیتی برای مدیرت منابع (فایل‌ها، دیتابیس و...) می‌باشد، منابعی که کار کردن با آن‌ها همواره نیازمند عملیات‌ ثابتی همچون باز (Open) و بسته (Close) کردن هستند. در این بخش می‌خواهیم به بررسی چگونگی ایجاد یک کلاس به همراه قابلیت Context Manager بپردازیم که در نهایت از اشیای آن بتوانیم در کنار دستور ``with/as`` استفاده نماییم.
755+
به صورت کلی Context Manager در زبان برنامه‌نویسی پایتون قابلیتی برای مدیرت منابع (فایل‌ها، دیتابیس، ارتباط و سایر منابع) می‌باشد، منابعی که کار کردن با آن‌ها همواره نیازمند عملیات‌ ثابتی همچون باز (Open) و بسته (Close) - Start/Stop, Lock/Release, Change/Reset - کردن هستند.
756756

757-
اجازه دهید بار دیگر ساختار دستور ``with/as`` را بررسی نماییم::
757+
در این بخش می‌خواهیم به بررسی چگونگی ایجاد یک کلاس به همراه قابلیت Context Manager بپردازیم که در نهایت از اشیای آن بتوانیم در کنار دستور ``with/as`` استفاده نماییم. ابتدا اجازه دهید بار دیگر ساختار دستور ``with/as`` را بررسی نماییم::
758758

759759
with context_expression [as target]:
760760
with_statement_body
761761

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__>`__] را در کلاس مورد نظر خود پیاده‌سازی کنیم:
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__>`__] را در کلاس مورد نظر خود پیاده‌سازی کنیم:
763763

764764
.. code-block:: python
765765
:linenos:
@@ -790,6 +790,38 @@ Context Manager و دستور ``with/as``
790790

791791
* اجرای متد ``__exit__`` زمانی است که کار یا اجرای context به پایان رسیده است. این متد در واقع فرصتی برای تمیزکاری یا به اصطلاح clean up کردن آثار اجرای context می‌باشد. به مانند پاک کردن فایل‌هایی که موقت ایجاد شده‌اند، حذف اشیای اضافی باقی‌مانده یا انجام عمل بستن یک فایل یا پایان دادن یک ارتباط (Connection) یا...
792792

793+
برای آشنایی بیشتر در نمونه کد زیر یک Wrapper برای شی فایل ایجاد کرده‌ایم:
794+
795+
.. code-block:: python
796+
:linenos:
797+
798+
class FileWritterWrapper:
799+
def __init__(self, filename):
800+
self.filename = filename
801+
802+
def __enter__(self):
803+
self.opened_file = open(self.filename, 'a')
804+
self.opened_file.write('====== OPEN FILE ======\n')
805+
return self.opened_file
806+
807+
def __exit__(self, *args):
808+
self.opened_file.write('\n====== CLOSE FILE ======\n')
809+
self.opened_file.close()
810+
811+
812+
with FileWritterWrapper('test_log.txt') as managed_file:
813+
managed_file.write('Inside context manager!')
814+
815+
محتویات فایل test_log.txt، پس از اجرای کد بالا:
816+
817+
::
818+
819+
820+
====== OPEN FILE ======
821+
Inside context manager!
822+
====== CLOSE FILE ======
823+
824+
793825
|
794826
795827
----

0 commit comments

Comments
 (0)