Skip to content

Commit 47791f1

Browse files
author
Saeid Darvish
committed
l18: start Inheritance
1 parent 6fef0fb commit 47791f1

2 files changed

Lines changed: 85 additions & 5 deletions

File tree

34.5 KB
Loading

lessons/l18.rst

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,91 @@
3030
وراثت (Inheritance)
3131
----------------------------------
3232

33-
34-
35-
36-
37-
33+
وراثت به معنی امکانی است که یک کلاس بتواند صفات و رفتارهای یک کلاس دیگر را نیز به همراه خود داشته باشد. پیاده‌سازی وراثت در پایتون حداقل به دو کلاس نیاز دارد:
34+
35+
* **base class** یا **superclass**: کلاس اصلی یا کلاسی می‌خواهیم کلاس یا کلاس‌های دیگری آن را به ارث ببرند و صفات و رفتارهای آن به دیگر کلاس(ها) سرایت پیدا کند.
36+
* **derived class** یا **subclass**: کلاس یا کلاس‌هایی که از superclass ارث‌بری خواهند داشت.
37+
38+
.. image:: /_static/l18-python-oop-inheritance.jpg
39+
:align: center
40+
41+
تصویر بالا یک نمونه ساده از ساختار وراثت را نمایش می‌دهد. در برنامه ما قرار است یک کلاس گنجشک (Sparrow) و سگ (Dog) ایجاد گردد، از آنجا که برخی از رفتارهای این دو کلاس یکسان است مانند راه رفتن (Walk) یا نفس کشیدن (Breathe)، یک superclass کلاس برای آن‌ها با نام Animal ایجاد می‌کنیم که شامل صفات و رفتارهای مشترک دو کلاس نام برده باشد - پیاده‌سازی پایتونی تصویر بالا به صورت نمونه کد زیر خواهد بود:
42+
43+
.. code-block:: python
44+
:linenos:
45+
46+
class Animal:
47+
48+
def walk(self):
49+
print(f'{self.__class__.__name__}: wlking...')
50+
51+
def breathe(self):
52+
print(f'{self.__class__.__name__}: breathing...')
53+
54+
55+
class Sparrow(Animal):
56+
57+
def fly(self):
58+
print(f'{self.__class__.__name__}: flying...')
59+
60+
61+
class Dog(Animal):
62+
63+
def run(self):
64+
print(f'{self.__class__.__name__}: running...')
65+
66+
67+
sparrow = Sparrow()
68+
dog = Dog()
69+
70+
sparrow.walk()
71+
sparrow.breathe()
72+
sparrow.fly()
73+
74+
print('-' * 30)
75+
76+
dog.walk()
77+
dog.breathe()
78+
dog.run()
79+
80+
::
81+
82+
Sparrow: wlking...
83+
Sparrow: breathing...
84+
Sparrow: flying...
85+
------------------------------
86+
Dog: wlking...
87+
Dog: breathing...
88+
Dog: running...
89+
90+
.. tip::
91+
92+
همانطور که از نمونه کد بالا مشاهده می‌شود، زمانی که یک شی subclass، متد superclass خود را فراخوانی می‌کند، مقدار ``self`` در متد superclass برابر با شی فراخوانی کننده متد یعنی همان subclass خواهد بود.
93+
94+
به صورت پیش‌فرض هر شی پایتون حاوی Attributeها و متدهایی است که فهرست آن‌ها با استفاده از تابع ``dir`` [`اسناد پایتون <https://docs.python.org/3/library/functions.html#dir>`__] قابل مشاهده خواهد بود. با این توضیح صفت ``__self.__class`` حاوی کلاس شی می‌باشد و ``__self.__class__.__name`` نیز نام کلاس شی را در بر دارد - *این موضوع در درس‌های پیش نیز مطرح شده بود*::
95+
96+
>>> class Sample:
97+
... def imethod(self):
98+
... print(dir(self))
99+
... print()
100+
... print(self.__class__)
101+
...
102+
>>>
103+
>>> sample = Sample()
104+
>>> sample.imethod()
105+
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'imethod']
106+
107+
<class '__main__.Sample'>
108+
>>>
109+
110+
با این حال، برخی اشیا پایتون حاوی Attributeهایی هستند که ممکن است توسط تابع ``dir`` نمایش داده نشود. از این Attributeها به عنوان Special Attributes یاد می‌شود [`اسناد پایتون <https://docs.python.org/3/library/stdtypes.html#special-attributes>`__]. برای مثال صفت ``__definition.__name`` بسته به نوع definition، حاوی نام کلاس، تابع، متد یا غیره می‌باشد.
111+
112+
113+
Super Class
114+
~~~~~~~~~~~~
115+
116+
117+
38118
انجمن (Association)
39119
----------------------------------
40120

0 commit comments

Comments
 (0)