|
1 | 1 | .. role:: emoji-size |
2 | 2 |
|
3 | 3 | .. meta:: |
4 | | - :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، OOP در پایتون، Decorators در پایتون، Descriptors در پایتون، property@ در پایتون |
| 4 | + :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، OOP در پایتون، Decorators در پایتون، Descriptors در پایتون، property@ در پایتون، Context Manager در پایتون، دستور with / as |
5 | 5 | :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, Decorators, کتابخانه, پایتون, شی گرایی در پایتون, Descriptors,property@ |
6 | 6 |
|
7 | 7 |
|
8 | | -درس ۲۱: شی گرایی (OOP) در پایتون: __Descriptors ،Decorator ،__slots و property@ |
| 8 | +درس ۲۱: شی گرایی (OOP) در پایتون: Context Manager ،Descriptors ،Decorator |
9 | 9 | =================================================================================================== |
10 | 10 |
|
11 | 11 | .. figure:: /_static/pages/21-python-object-oriented-programming-property-descriptors.jpg |
12 | 12 | :align: center |
13 | | - :alt: شی گرایی (OOP) در پایتون: __Descriptors ،Decorator ،__slots و property@ |
| 13 | + :alt: شی گرایی (OOP) در پایتون: __Descriptors ، Context Manager ،Decorator ،__slots و property@ |
14 | 14 |
|
15 | 15 | Photo by `Mathyas Kurmann <https://unsplash.com/photos/fb7yNPbT0l8>`__ |
16 | 16 |
|
@@ -752,14 +752,14 @@ Context Manager و دستور ``with/as`` |
752 | 752 |
|
753 | 753 | یکی دیگر از قابلیتهای کمتر شناخته شده در زبان برنامهنویسی پایتون، Context Manager میباشد [`اسناد پایتون <http://docs.python.org/3/library/stdtypes.html#typecontextmanager>`__]. با این حال اکثر برنامهنویسان پایتون به صورت مداوم از آن بهره میگیرند. اگر درس دهم را به یاد داشته باشیم، از دستور ``with/as`` برای کار با فایلها در پایتون استفاده میکردیم و شاهد راحتی و زیبایی کارها نسبت به قبل بودیم. در آن زمان تنها اشاره شد که شی فایل پایتون را میتوان با دستور ``with/as`` استفاده کرد چون این شی از قابلیت Context Manager پشتیبانی میکند. |
754 | 754 |
|
755 | | -به صورت کلی Context Manager در زبان برنامهنویسی پایتون قابلیتی برای مدیرت منابع (فایلها، دیتابیس و...) میباشد، منابعی که کار کردن با آنها همواره نیازمند عملیات ثابتی همچون باز (Open) و بسته (Close) کردن هستند. در این بخش میخواهیم به بررسی چگونگی ایجاد یک کلاس به همراه قابلیت Context Manager بپردازیم که در نهایت از اشیای آن بتوانیم در کنار دستور ``with/as`` استفاده نماییم. |
| 755 | +به صورت کلی Context Manager در زبان برنامهنویسی پایتون قابلیتی برای مدیرت منابع (فایلها، دیتابیس، ارتباط و سایر منابع) میباشد، منابعی که کار کردن با آنها همواره نیازمند عملیات ثابتی همچون باز (Open) و بسته (Close) - Start/Stop, Lock/Release, Change/Reset - کردن هستند. |
756 | 756 |
|
757 | | -اجازه دهید بار دیگر ساختار دستور ``with/as`` را بررسی نماییم:: |
| 757 | +در این بخش میخواهیم به بررسی چگونگی ایجاد یک کلاس به همراه قابلیت Context Manager بپردازیم که در نهایت از اشیای آن بتوانیم در کنار دستور ``with/as`` استفاده نماییم. ابتدا اجازه دهید بار دیگر ساختار دستور ``with/as`` را بررسی نماییم:: |
758 | 758 |
|
759 | 759 | with context_expression [as target]: |
760 | 760 | with_statement_body |
761 | 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__>`__] را در کلاس مورد نظر خود پیادهسازی کنیم: |
| 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 | 763 |
|
764 | 764 | .. code-block:: python |
765 | 765 | :linenos: |
@@ -790,6 +790,38 @@ Context Manager و دستور ``with/as`` |
790 | 790 |
|
791 | 791 | * اجرای متد ``__exit__`` زمانی است که کار یا اجرای context به پایان رسیده است. این متد در واقع فرصتی برای تمیزکاری یا به اصطلاح clean up کردن آثار اجرای context میباشد. به مانند پاک کردن فایلهایی که موقت ایجاد شدهاند، حذف اشیای اضافی باقیمانده یا انجام عمل بستن یک فایل یا پایان دادن یک ارتباط (Connection) یا... |
792 | 792 |
|
| 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 | + |
793 | 825 | | |
794 | 826 |
|
795 | 827 | ---- |
|
0 commit comments