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
این درس نیز در ادامه مجموعه دروس آموزش شی گرایی در زبان برنامهنویسی پایتون میباشد که به شرح و جمعبندی برخی موارد مرتبط با مفاهیم کلاس و شی موجود در پایتون میپردازد. مواردی که ممکن است قابل گذر باشند ولی هریک نکاتی دارند که در توسعه برنامه شی گرای پایتونی به شما کمک خواهند کرد. مواردی همچون صفت ویژه __slots__ در کلاسها، ایجاد Decorator با استفاده از کلاس در پایتون و همچنین ایجاد قابلیت getter و setter در پایتون با استفاده از مفاهیم Descriptors و دکوراتور property که در ادامه تا حد کافی شرح داده خواهند شد.
12
+
11
13
12
14
توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند دروس پیش شی گرایی و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
13
15
@@ -62,7 +64,7 @@ __slots__
62
64
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
63
65
4
64
66
65
-
پیشتر نیز صحبت کرده بودیم، میتوان پس از ایجاد یک شی به آن Attribute اضافه کنیم (به دو سطر ۱۲ و ۱۷ توجه نمایید). دادههای مربوط به تمام Attributeهای یک شی توسط یک شی دیکشنری که از طریق ``__dict__`` در دسترس میباشد، نگهداری میشود.
67
+
پیشتر نیز صحبت کرده بودیم، میتوان حتی پس از ایجاد یک شی نیز به آن Attribute جدید اضافه کنیم (به دو سطر ۱۲ و ۱۷ توجه نمایید). دادههای مربوط به تمام Attributeهای یک شی توسط یک شی دیکشنری که از طریق ``__dict__`` در دسترس میباشد، نگهداری میشود. در پس زمینه پایتون این ``__dict__`` میباشد که امکان افزودن Attribute به شی را به صورت پویا (Dynamic) فراهم آورده است.
66
68
67
69
``__slots__`` [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#slots>`__] یک Attribute ویژه در پایتون میباشد که با مقداردهی آن میتوان از ایجاد ``__dict__`` جلوگیری و در نتیجه قابلیت افزودن Attribute جدید به شی را غیرفعال و تعداد Attributeهای آن را از همان نقطه ایجاد، ثابت نگهداشت:
68
70
@@ -79,14 +81,14 @@ __slots__
79
81
self.b = b
80
82
81
83
82
-
objet= Sample(1, 2)
83
-
print(objet.__dict__)
84
+
obj= Sample(1, 2)
85
+
print(obj.__dict__)
84
86
85
87
::
86
88
87
89
Traceback (most recent call last):
88
90
File "sample.py", line 11, in <module>
89
-
print(objet.__dict__)
91
+
print(obj.__dict__)
90
92
AttributeError: 'Sample' object has no attribute '__dict__'
91
93
92
94
@@ -164,7 +166,7 @@ __slots__
164
166
c: 3
165
167
166
168
167
-
اگر کلاس Parent شامل ``__slots__`` باشد و در نتیجه فاقد ``__dict__``:
169
+
اگر کلاس Parent شامل ``__slots__`` بوده و در نتیجه فاقد ``__dict__`` باشد:
168
170
169
171
.. code-block:: python
170
172
:linenos:
@@ -281,15 +283,18 @@ __slots__
281
283
child = Child()
282
284
283
285
286
+
در مواقع خاص که میخواهید هم Attributeها را محدود کنید و هم قابلیت ``__dict__`` را حفظ کنید، میتوانید ``__dict__`` را هم به مقدار ``__slots__`` اضافه نمایید.
287
+
288
+
284
289
|
285
290
286
291
287
-
[`مطلب مرتبط در StackOverflow <https://stackoverflow.com/a/28059785>`__]
292
+
[`مطالعه بیشتر: پرسش و پاسخ مرتبط در StackOverflow <https://stackoverflow.com/a/28059785>`__]
288
293
289
294
Decorators
290
295
----------------------------
291
296
292
-
از درس سیزدهم با مفهوم Decoratorها و نیز کاربرد آنها به همراه تابع در زبان برنامهنویسی پایتون آشنا شدهایم، در این بخش به بررسی Decoratorهابه همراه کلاسها و متدها میپردازیم.
297
+
از درس سیزدهم با مفهوم Decoratorها و نیز کاربرد آنها به همراه تابع در زبان برنامهنویسی پایتون آشنا شدهایم، در این بخش به بررسی Decoratorها به همراه کلاسها و متدها میپردازیم.
293
298
294
299
علاوه بر اینکه با استفاده از کلاس میتوان یک Decorator ایجاد کرد، از Decoratorها نیز میتوان بر روی کلاس یا متدهای داخل یک کلاس بهره گرفت. در ادامه به بررسی این موارد میپردازیم.
در زبان برنامهنویسی پایتون میتوان یک Decorator را به کل یک کلاس اعمال کرد، در این صورت نیز تفاوتی با آنچه در توابع دیدم، نمیکند. تنها در این حالت، این کلاس است که به Decorator ارسال میگردد. دو نمونه کد زیر معادل یکدیگر هستند::
352
+
در زبان برنامهنویسی پایتون میتوان یک Decorator را به کل یک کلاس اعمال کرد، در این صورت نیز تفاوتی با آنچه در توابع دیدیم، نمیکند. تنها در این حالت، این کلاس است که به Decorator ارسال میگردد. دو نمونه کد زیر معادل یکدیگر هستند::
348
353
349
354
350
355
def decorator_name(a_class):
@@ -479,7 +484,7 @@ Descriptors
479
484
480
485
۱- یک کلاس ایجاد کنیم که در آن حداقل یکی از متدهای خاص ``__set__`` ،``__get__`` و ``__delete__`` بازپیادهسازی (یا بهتر است بگوییم Override) شود.
481
486
482
-
۲- از شی این کلاس به عنوان attribute مناسب از کلاس مورد نظر استفاده کنیم.
487
+
۲- از شی این کلاس به عنوان مقدار attribute مناسب از کلاس مورد نظر استفاده کنیم.
0 commit comments