Skip to content

Commit e18fb90

Browse files
author
Saeid Darvish
committed
completed: l21 & l22
1 parent ef7088a commit e18fb90

3 files changed

Lines changed: 54 additions & 35 deletions

File tree

lessons/l21.rst

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
درس ۲۱: شی گرایی (OOP) در پایتون: __Descriptors ،Decorator ،__slots و property@
99
===================================================================================================
1010

11+
این درس نیز در ادامه مجموعه دروس آموزش شی گرایی در زبان برنامه‌نویسی پایتون می‌باشد که به شرح و جمع‌بندی برخی موارد مرتبط با مفاهیم کلاس و شی موجود در پایتون می‌پردازد. مواردی که ممکن است قابل گذر باشند ولی هریک نکاتی دارند که در توسعه برنامه شی گرای پایتونی به شما کمک خواهند کرد. مواردی همچون صفت ویژه __slots__ در کلاس‌ها، ایجاد Decorator با استفاده از کلاس در پایتون و همچنین ایجاد قابلیت getter و setter در پایتون با استفاده از مفاهیم Descriptors و دکوراتور property که در ادامه تا حد کافی شرح داده خواهند شد.
12+
1113

1214
توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند دروس پیش شی گرایی و به منظور جلوگیری از پیچیدگی‌های غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه می‌شود.
1315

@@ -62,7 +64,7 @@ __slots__
6264
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
6365
4
6466

65-
پیشتر نیز صحبت کرده بودیم، می‌توان پس از ایجاد یک شی به آن Attribute اضافه کنیم (به دو سطر ۱۲ و ۱۷ توجه نمایید). داده‌های مربوط به تمام Attributeهای یک شی توسط یک شی دیکشنری که از طریق ``__dict__`` در دسترس می‌باشد، نگهداری می‌شود.
67+
پیشتر نیز صحبت کرده بودیم، می‌توان حتی پس از ایجاد یک شی نیز به آن Attribute جدید اضافه کنیم (به دو سطر ۱۲ و ۱۷ توجه نمایید). داده‌های مربوط به تمام Attributeهای یک شی توسط یک شی دیکشنری که از طریق ``__dict__`` در دسترس می‌باشد، نگهداری می‌شود. در پس زمینه پایتون این ``__dict__`` می‌باشد که امکان افزودن Attribute به شی را به صورت پویا (Dynamic) فراهم آورده است.
6668

6769
``__slots__`` [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#slots>`__] یک Attribute ویژه در پایتون می‌باشد که با مقداردهی آن می‌توان از ایجاد ``__dict__`` جلوگیری و در نتیجه قابلیت افزودن Attribute جدید به شی را غیرفعال و تعداد Attributeهای آن را از همان نقطه ایجاد، ثابت نگه‌داشت:
6870

@@ -79,14 +81,14 @@ __slots__
7981
self.b = b
8082
8183
82-
objet = Sample(1, 2)
83-
print(objet.__dict__)
84+
obj = Sample(1, 2)
85+
print(obj.__dict__)
8486
8587
::
8688

8789
Traceback (most recent call last):
8890
File "sample.py", line 11, in <module>
89-
print(objet.__dict__)
91+
print(obj.__dict__)
9092
AttributeError: 'Sample' object has no attribute '__dict__'
9193

9294

@@ -164,7 +166,7 @@ __slots__
164166
c: 3
165167

166168

167-
اگر کلاس Parent شامل ``__slots__`` باشد و در نتیجه فاقد ``__dict__``:
169+
اگر کلاس Parent شامل ``__slots__`` بوده و در نتیجه فاقد ``__dict__`` باشد:
168170

169171
.. code-block:: python
170172
:linenos:
@@ -281,15 +283,18 @@ __slots__
281283
child = Child()
282284
283285
286+
در مواقع خاص که می‌خواهید هم Attributeها را محدود کنید و هم قابلیت ``__dict__`` را حفظ کنید، می‌توانید ``__dict__`` را هم به مقدار ``__slots__`` اضافه نمایید.
287+
288+
284289
|
285290
286291

287-
[`مطلب مرتبط در StackOverflow <https://stackoverflow.com/a/28059785>`__]
292+
[`مطالعه بیشتر: پرسش و پاسخ مرتبط در StackOverflow <https://stackoverflow.com/a/28059785>`__]
288293

289294
Decorators
290295
----------------------------
291296

292-
از درس سیزدهم با مفهوم Decoratorها و نیز کاربرد آن‌ها به همراه تابع در زبان برنامه‌نویسی پایتون آشنا شده‌ایم، در این بخش به بررسی Decoratorهابه همراه کلاس‌ها و متدها می‌پردازیم.
297+
از درس سیزدهم با مفهوم Decoratorها و نیز کاربرد آن‌ها به همراه تابع در زبان برنامه‌نویسی پایتون آشنا شده‌ایم، در این بخش به بررسی Decoratorها به همراه کلاس‌ها و متدها می‌پردازیم.
293298

294299
علاوه بر اینکه با استفاده از کلاس می‌توان یک Decorator ایجاد کرد، از Decorator‌ها نیز می‌توان بر روی کلاس یا متدهای داخل یک کلاس بهره گرفت. در ادامه به بررسی این موارد می‌پردازیم.
295300

@@ -344,7 +349,7 @@ Decorators
344349
قراردادن Decorator بر روی کلاس
345350
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
346351

347-
در زبان برنامه‌نویسی پایتون می‌توان یک Decorator را به کل یک کلاس اعمال کرد، در این صورت نیز تفاوتی با آنچه در توابع دیدم، نمی‌کند. تنها در این حالت، این کلاس است که به Decorator ارسال می‌گردد. دو نمونه کد زیر معادل یکدیگر هستند::
352+
در زبان برنامه‌نویسی پایتون می‌توان یک Decorator را به کل یک کلاس اعمال کرد، در این صورت نیز تفاوتی با آنچه در توابع دیدیم، نمی‌کند. تنها در این حالت، این کلاس است که به Decorator ارسال می‌گردد. دو نمونه کد زیر معادل یکدیگر هستند::
348353

349354

350355
def decorator_name(a_class):
@@ -479,7 +484,7 @@ Descriptors
479484

480485
۱- یک کلاس ایجاد کنیم که در آن حداقل یکی از متدهای خاص ``__set__`` ،``__get__`` و ``__delete__`` بازپیاده‌سازی (یا بهتر است بگوییم Override) شود.
481486

482-
۲- از شی این کلاس به عنوان attribute مناسب از کلاس مورد نظر استفاده کنیم.
487+
۲- از شی این کلاس به عنوان مقدار attribute مناسب از کلاس مورد نظر استفاده کنیم.
483488

484489

485490
**کاربرد Descriptor پایتون چیست؟**

0 commit comments

Comments
 (0)