Skip to content

Commit cb7fca7

Browse files
author
Saeid Darvish
committed
l19: Abstraction, completed
1 parent 1044720 commit cb7fca7

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

lessons/l19.rst

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@
286286
287287
288288
.. note::
289-
در بحث کلاس‌های Abstract زبان برنامه‌نویسی پایتون می‌بایست نکات زیر را در نظر داشت:
289+
در بحث کلاس‌های Abstract زبان برنامه‌نویسی پایتون می‌بایست نکات زیر را در نظر داشته باشید:
290290

291291
* کلاس‌های Abstract می‌توانند علاوه بر متدهای Abstract، شامل متدهای معمولی که پیش‌تر شرح داده شد نیز باشند.
292292

@@ -301,10 +301,14 @@
301301
* هیچ اجباری به خالی بودن بدنه (عدم پیاده‌سازی) متدهای Abstract در داخل کلاس Abstract نیست، این متدها در کلاس Abstract می‌توانند شامل یک پیاده‌سازی پیش‌فرض باشند، که اشیا subclassها در صورت نیاز می‌توانند با استفاده از تابع ``()super`` (همانطور که پیش‌تر شرح داده شد)، متد نظیر کلاس Abstract را نیز فراخوانی کنند.
302302

303303
* کلاس‌های Abstract می‌توانند مانند دیگر کلاس‌ها در چند سطح از سلسله مراتب وراثت شرکت کنند (از یکدیگر ارث‌بری داشته باشند)، بنابراین باید توجه داشت که تنها subclassهایی که تمام متدهای Abstract مربوط به superclassهای خود را پیاده‌سازی کرده باشد به عنوان یک کلاس نرمال یا به اصطلاح Concrete حساب می‌شود و می‌توان از آن نمونه‌سازی کرد، در غیر این صورت مفسر پایتون آن کلاس را به عنوان یک کلاس Abstract در نظر می‌گیرد و اجازه نمونه‌سازی از آن را نخواهد داد.
304+
305+
* از کاربرد کلاس‌های Abstract می‌توان به قرار دادن شرط الزام به پیاده‌سازی یک سری متد مشخص اشاره کرد. به این صورت که برنامه‌نویس با تعریف یک کلاس Abstract، می‌گوید که اشیا مورد نیاز می‌بایست چه کاری انجام بدهند ولی نمی‌گوید چگونه، چرا که هر شی می‌تواند نسبت به نوع یا کلاس خود، یک پیاده‌سازی متفاوت از انجام یک کار مشترک را داشته باشد. از طرفی تنها این مهم است که تمامی اشیای دریافتی، یک سری متد مورد نیاز را حتما پیاده‌سازی کرده باشند. اکنون برنامه‌نویس می‌تواند با بررسی نوع شی، تنها به اشیایی که نوع آن کلاس Abstract را به ارث برده‌اند (مثلا با استفاده از تابع ``isinstance``)، اجازه پذیرش برای کار مورد نظر خود را بدهد و از بروز خطا در برنامه جلوگیری کند. در این صورت می‌توان مطمئن بود که اشیا از هر کلاسی که ایجاد شده باشند، حتما متدهای مورد نظر ما را پیاده‌سازی کرده‌اند.
304306

305307

306308
نمونه کد زیر را در نظر بگیرید:
307309

310+
در برنامه، قرار است کلاس مربوط به دو گونه آبزیان (Aquatics) و پستانداران (Mammals) از حیوانات ایجاد گردد. حیوانات برخی رفتارهای مشترک دارند و برخی رفتارهایی که خاص گونه خودشان می‌باشد. حتی ممکن است پیاده‌سازی برخی رفتارها در هر نوع حیوان متناسب با خودش متفاوت باشد. بنابراین ما دو سطح از سلسله مراتب وراثت ایجاد کرده‌ایم و به منظور مرتبط بودن مثال با مبحث جاری، تنها از کلاس‌های Abstract برای پیاده‌سازی supperclassهای مربوطه بهره گرفتیم و پیاده‌سازی هر رفتار را به خود موجودیت نهایی واگذار کردیم تا کاملا شخصی و نسبت به مورد پیاده‌سازی گردند. در این مثال تعریف کلاس دو حیوان نهنگ قاتل (Killer Whale) که یک پستاندار دریایی است و خصوصیاتی مشترک از هر دو گروه آبزی و پستاندار را دارد (وراثت چندگانه) و شیر (Lion) که تنها جزو گروه پستانداران می‌باشد آورده شده است.
311+
308312
.. code-block:: python
309313
:linenos:
310314
@@ -317,7 +321,7 @@
317321
'''Implement breathing skills'''
318322
319323
320-
class Fish(Animal):
324+
class Aquatic(Animal):
321325
322326
@abstractmethod
323327
def swimming(self):
@@ -332,7 +336,7 @@
332336
333337
334338
335-
class KillerWhale(Fish, Mammal):
339+
class KillerWhale(Aquatic, Mammal):
336340
337341
def breathing(self):
338342
print(f'{self.__class__.__name__}: breathing...')

0 commit comments

Comments
 (0)