|
296 | 296 |
|
297 | 297 | * متدهای Abstract مانند هر متدی دیگری در پایتون میتوانند از انواع Instance Method یا Class Method یا Static Method باشند. توجه داشته باشید که این قانون در مورد Class Method و Static Method از نسخه 3.3 به بعد پایتون پشتیبانی میگردد. |
298 | 298 |
|
299 | | - * معمولا بدنه متدهای Abstract میبایست بدون پیادهسازی باشند، این کار میتواند با قرار دادن دستورهایی همچون ``pass`` یا ``return`` یا ``return None`` نیز انجام شود ولی بهترین کار استفاده از Docstring میباشد (درس ششم)، با یک تیر دو نشان خواهید زد! |
| 299 | + * معمولا بدنه متدهای Abstract بدون پیادهسازی هستند، این کار میتواند با قرار دادن دستورهایی همچون ``pass`` یا ``return`` یا ``return None`` نیز انجام شود ولی بهترین کار استفاده از Docstring میباشد (درس ششم)، با یک تیر دو نشان خواهید زد! |
300 | 300 |
|
301 | 301 | * هیچ اجباری به خالی بودن بدنه (عدم پیادهسازی) متدهای Abstract در داخل کلاس Abstract نیست، این متدها در کلاس Abstract میتوانند شامل یک پیادهسازی پیشفرض باشند، که اشیا subclassها در صورت نیاز میتوانند با استفاده از تابع ``()super`` (همانطور که پیشتر شرح داده شد)، متد نظیر کلاس Abstract را نیز فراخوانی کنند. |
302 | 302 |
|
303 | 303 | * کلاسهای 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 | + |
304 | 380 |
|
305 | 381 | | |
306 | 382 |
|
|
0 commit comments