Skip to content

Commit 1044720

Browse files
author
Saeid
committed
l19: a sample of Abstraction
1 parent 728b3d9 commit 1044720

1 file changed

Lines changed: 77 additions & 1 deletion

File tree

lessons/l19.rst

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,87 @@
296296

297297
* متدهای Abstract مانند هر متدی دیگری در پایتون می‌توانند از انواع Instance Method یا Class Method یا Static Method باشند. توجه داشته باشید که این قانون در مورد Class Method و Static Method از نسخه 3.3 به بعد پایتون پشتیبانی می‌گردد.
298298

299-
* معمولا بدنه متدهای Abstract می‌بایست بدون پیا‌ده‌سازی باشند، این کار می‌تواند با قرار دادن دستورهایی همچون ``pass`` یا ``return`` یا ``return None`` نیز انجام شود ولی بهترین کار استفاده از Docstring می‌باشد (درس ششم)، با یک تیر دو نشان خواهید زد!
299+
* معمولا بدنه متدهای Abstract بدون پیا‌ده‌سازی هستند، این کار می‌تواند با قرار دادن دستورهایی همچون ``pass`` یا ``return`` یا ``return None`` نیز انجام شود ولی بهترین کار استفاده از Docstring می‌باشد (درس ششم)، با یک تیر دو نشان خواهید زد!
300300

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

303303
* کلاس‌های Abstract می‌توانند مانند دیگر کلاس‌ها در چند سطح از سلسله مراتب وراثت شرکت کنند (از یکدیگر ارث‌بری داشته باشند)، بنابراین باید توجه داشت که تنها subclassهایی که تمام متدهای Abstract مربوط به superclassهای خود را پیاده‌سازی کرده باشد به عنوان یک کلاس نرمال یا به اصطلاح Concrete حساب می‌شود و می‌توان از آن نمونه‌سازی کرد، در غیر این صورت مفسر پایتون آن کلاس را به عنوان یک کلاس Abstract در نظر می‌گیرد و اجازه نمونه‌سازی از آن را نخواهد داد.
304+
305+
306+
نمونه کد زیر را در نظر بگیرید:
307+
308+
.. code-block:: python
309+
:linenos:
310+
311+
from abc import ABCMeta, abstractmethod
312+
313+
class Animal(metaclass=ABCMeta):
314+
315+
@abstractmethod
316+
def breathing(self):
317+
'''Implement breathing skills'''
318+
319+
320+
class Fish(Animal):
321+
322+
@abstractmethod
323+
def swimming(self):
324+
'''Implement swimming skills'''
325+
326+
327+
class Mammal(Animal):
328+
329+
@abstractmethod
330+
def breastfeeding(self):
331+
'''Implement breastfeeding skills'''
332+
333+
334+
335+
class KillerWhale(Fish, Mammal):
336+
337+
def breathing(self):
338+
print(f'{self.__class__.__name__}: breathing...')
339+
340+
def swimming(self):
341+
print(f'{self.__class__.__name__}: swimming...')
342+
343+
def breastfeeding(self):
344+
print(f'{self.__class__.__name__}: breastfeeding...')
345+
346+
347+
class Lion(Mammal):
348+
349+
def breathing(self):
350+
print(f'{self.__class__.__name__}: breathing...')
351+
352+
def breastfeeding(self):
353+
print(f'{self.__class__.__name__}: breastfeeding...')
354+
355+
356+
killer_whale = KillerWhale()
357+
killer_whale.breathing()
358+
killer_whale.swimming()
359+
killer_whale.breastfeeding()
360+
361+
print('-' * 30)
362+
363+
lion = Lion()
364+
lion.breathing()
365+
lion.breastfeeding()
366+
367+
::
368+
369+
KillerWhale: breathing...
370+
KillerWhale: swimming...
371+
KillerWhale: breastfeeding...
372+
------------------------------
373+
Lion: breathing...
374+
Lion: breastfeeding...
375+
376+
377+
378+
379+
304380

305381
|
306382

0 commit comments

Comments
 (0)