Skip to content

Commit 574ae48

Browse files
author
Saeid Darvish
committed
add mixin in l18 & start l21
1 parent 9b9a979 commit 574ae48

3 files changed

Lines changed: 178 additions & 2 deletions

File tree

index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
lessons/l18
4747
lessons/l19
4848
lessons/l20
49+
lessons/l21
4950
log
5051
donate-report
5152
python-interactive

lessons/l18.rst

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
.. role:: emoji-size
22

33
.. meta::
4-
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، معرفی رابطه های وراثت (Inheritance) و انجمن (Association) در پایان، OOP در پایتون، ترکیب در پایتون، Method Resolution Order یا MRO پایتون، Composition و Aggregation در پایتون، وراثت چندگانه در پایتون، Multiple Inheritance پایتون
4+
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، معرفی رابطه های وراثت (Inheritance) و انجمن (Association) در پایان، OOP در پایتون، ترکیب در پایتون، Method Resolution Order یا MRO پایتون، Composition و Aggregation در پایتون، وراثت چندگانه در پایتون، Multiple Inheritance پایتون، کلاس Mixin در پایتون
55
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, شی گرایی در پایتون
66

77

8-
درس ۱۸: شی گرایی (OOP) در پایتون: وراثت (Inheritance) و Association
8+
درس ۱۸: شی گرایی (OOP) در پایتون: وراثت (Inheritance)، Association و Mixin
99
========================================================================================================
1010

1111

1212

1313
این درس در ادامه درس پیش می‌باشد و به بررسی رابطه بین کلاس‌ها و اشیا می‌پردازد. در درس پنجم مقدمه‌ای از این روابط صحبت شده است و این درس به صورت کامل دو رابطه **IS-A** یا Inheritance و **HAS-A** یا Association در مفهموم شی گرایی و چگونگی پیاده‌سازی آن‌ها در زبان برنامه‌نویسی پایتون را شرح می‌دهد.
1414

15+
در این درس همچنین به شرح **وراثت چندگانه (Multiple Inheritance)**، **Method Resolution Order** و کلاس‌های **Mixin** در زبان برنامه‌نویسی پایتون خواهیم پرداخت.
16+
1517
توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند درس پیش و به منظور جلوگیری از پیچیدگی‌های غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه می‌شود.
1618

1719

@@ -695,6 +697,61 @@ Aggregation
695697

696698

697699

700+
Mixin
701+
----------------------------------
702+
703+
همواره در میان صحبت از شی گرایی، کلاس و وراثت از مفهومی با نام **Mixin** نیز یاد می‌شود [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Mixin>`__]. Mixin نوعی استفاده از مفهوم کلاس و وراثت می‌باشد ولی با هدفی دیگر، Mixin کلاسی است که معمولا تنها شامل متد بوده و با هدف گسترش عملکردهای (functionality) دیگر کلاس‌ها توسعه می‌یابد.
704+
705+
پشتیبانی وراثت چندگانه در زبان برنامه‌نویسی پایتون، پیاده‌سازی Mixin را بسیار ساده کرده است. Mixin مجموعه‌ای از functionalityهاست که هر کلاسی که با آن functionalityها نیاز داشته باشد، می‌تواند از آن Mixin ارث‌بری داشته باشد. البته باید توجه داشت که منطق پیاده‌سازی Mixin ایجاد رابطه IS-A نمی‌باشد و هدف تنها گسترش functionality است، حتی اگر ظاهر کار چنین نباشد!
706+
707+
زمانی را تصور کنید که قصد دارید یک عملکرد یا متد یا functionality جدید را به مجموعه‌ای از کلاس‌های خود اضافه نمایید. در این شرایط چه کار باید کرد؟ این functionality را به بالاترین supperclass هر سلسله مراتب از کلاس‌های خود اضافه کنیم،‌ در این صورت علاه‌بر اینکه کلاس‌های پایه خود را به آسانی دستکاری کرده‌اید، یک کد یکسان را نیز چندین بار تکرار کرده‌اید که بر خلاف یکی از مهم‌ترین اصول برنامه نویسی است (DRY - Don't Repeat Yourself) [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Don%27t_repeat_yourself>`__]. پاسخ این مشکلات ایجاد Mixin است.
708+
709+
توجه داشته باشید که Mixin یک الگو طراحی است و نه یک ابزار، بنابراین پیاده‌سازی آن در زبان برنامه‌نویسی پایتون همانند ایجاد هر کلاس دیگری است منتها مرسوم است که به منظور تفکیک این دست از کلاس‌ها، در انتهای نام آن‌ها Mixin ذکر می‌گردد. چرا که Mixin کلاس‌هایی هستند که نباید از آن‌ها شی ایجاد شود و تنها دلیل موجودیت آن‌ها گسترش functionality است:
710+
711+
712+
.. code-block:: python
713+
:linenos:
714+
715+
class Vehicle:
716+
717+
def travel(self):
718+
pass
719+
720+
721+
class Car(Vehicle):
722+
pass
723+
724+
class Boat(Vehicle):
725+
pass
726+
727+
class Plane(Vehicle):
728+
pass
729+
730+
731+
نمونه کد بالا نمایش کلاس مربوط به سه نوع وسیله نقلیه (Vehicle) می‌باشد: خودرو (Car)، قایق (Boat) و هواپیما (Plane)، اکنون می‌خواهیم قابلیت پخش رادیو را به دو کلاس Car و Boat اضافه نماییم. اگر این functionality را به کلاس پایه (Vehicle) اضافه کنیم، در این صورت کلاس Plane نیز ناخواسته به این عملکرد دسترسی پیدا خواهد کرد که نه درست است و نه مطلوب. از طرفی نیز قرار دادن این عملکرد به صورت جداگانه در هر دو کلاس Car و Boat برخلاف DRY می‌باشد. برای این مسئله از الگو Mixin استفاده خواهیم کرد:
732+
733+
734+
.. code-block:: python
735+
:linenos:
736+
737+
class RadioMixin:
738+
def __init__(self):
739+
self.radio = Radio()
740+
741+
def play_on_station(self, station):
742+
self.radio.set_station(station)
743+
self.radio.play_song()
744+
745+
746+
class Car(Vehicle, RadioMixin):
747+
def __init__(self):
748+
RadioMixin.__init__(self)
749+
750+
class Boat(Vehicle, RadioMixin):
751+
def __init__(self):
752+
RadioMixin.__init__(self)
753+
754+
698755
699756
|
700757

lessons/l21.rst

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
.. role:: emoji-size
2+
3+
.. meta::
4+
:description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، OOP در پایتون، Decorators در پایتون، Descriptors در پایتون، Properties در پایتون، دیتا کلاس در پایتون، Data Classe در پایتون
5+
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, Decorators, کتابخانه, پایتون, شی گرایی در پایتون, Descriptors,Properties
6+
7+
8+
درس ۲۱: شی گرایی (OOP) در پایتون: Descriptors ،Decorator ،Data Class و Properties
9+
===================================================================================================
10+
11+
12+
توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند دروس پیش شی گرایی و به منظور جلوگیری از پیچیدگی‌های غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه می‌شود.
13+
14+
15+
16+
:emoji-size:`` سطح: متوسط
17+
18+
----
19+
20+
21+
.. contents:: سرفصل‌ها
22+
:depth: 2
23+
24+
----
25+
26+
27+
Data Classes
28+
----------------------------
29+
30+
31+
32+
33+
Decorators
34+
----------------------------
35+
36+
از درس سیزدهم با مفهوم Decoratorها و نیز کاربرد آن‌ها به همراه تابع در زبان برنامه‌نویسی پایتون آشنا شده‌ایم، در این بخش به بررسی Decoratorهابه همراه کلاس‌ها و متدها می‌پردازیم.
37+
38+
علاوه بر اینکه با استفاده از کلاس می‌توان یک Decorator ایجاد کرد، از Decorator‌ها نیز می‌توان بر روی کلاس یا متدهای داخل یک کلاس بهره گرفت. در ادامه به بررسی این موارد می‌پردازیم.
39+
40+
41+
قراردادن Decorator بر روی متد
42+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43+
44+
این کار همانند قراردادن Decorator بر روی تابع می‌باشد (درس سیزدهم) و تفاوتی ندارد. پیش‌تر نیز از Decoratorهایی همچون ``classmethod@`` یا ``staticmethod@`` بر روی متدها استفاده می‌کردیم. به مثالی در همین زمینه توجه نمایید:
45+
46+
47+
.. code-block:: python
48+
:linenos:
49+
50+
import functools
51+
52+
def debug(func):
53+
"""Print the function signature and return value
54+
Source: https://realpython.com/primer-on-python-decorators/#debugging-code"""
55+
56+
@functools.wraps(func)
57+
def wrapper_debug(*args, **kwargs):
58+
args_repr = [repr(a) for a in args]
59+
kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()]
60+
signature = ", ".join(args_repr + kwargs_repr)
61+
print(f"Calling {func.__name__}({signature})")
62+
value = func(*args, **kwargs)
63+
print(f"{func.__name__!r} returned {value!r}")
64+
return value
65+
return wrapper_debug
66+
67+
68+
69+
class Sample:
70+
71+
@debug
72+
def __init__(self, x=0, y=0):
73+
self.x = x
74+
self.y = y
75+
76+
77+
sample = Sample(5, y=6)
78+
79+
::
80+
81+
Calling __init__(<__main__.Sample object at 0x7fd96ddec8d0>, 5, y=6)
82+
'__init__' returned None
83+
84+
در نمونه کد بالا یک Decorator با نام ``debug`` ایجاد گردیده است (Decorator درس سیزدهم و f-string درس هفتم)، با قراردادن این Decorator بر روی یک تابع یا متد: نام تابع، آرگومان‌های ارسال شده و همچنین مقدار خروجی تابع را بر روی خروجی نمایش می‌دهد.
85+
86+
87+
88+
قراردادن Decorator بر روی کلاس
89+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
90+
91+
92+
93+
کلاس به عنوان Decorator
94+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
95+
96+
97+
98+
Descriptors
99+
----------------------------
100+
101+
102+
103+
Properties
104+
----------------------------
105+
106+
107+
108+
109+
|
110+
111+
----
112+
113+
:emoji-size:`😊` امیدوارم مفید بوده باشه
114+
115+
`لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید. <https://www.coderz.ir/python-tutorial-oop-descriptors-properties>`_
116+
117+
118+

0 commit comments

Comments
 (0)