logo

Абстрактні класи в Python

Абстрактний клас можна вважати планом для інших класи . Це дозволяє вам створити набір методів, які повинні бути створені в будь-яких дочірніх класах, побудованих з абстрактного класу.

Клас, який містить один або кілька абстрактних методів, називається an абстрактний клас . Ан абстрактний метод це метод, який має оголошення, але не має реалізації.



Ми використовуємо абстрактний клас, коли розробляємо великі функціональні одиниці або коли хочемо забезпечити загальний інтерфейс для різних реалізацій компонента.

Абстрактні базові класи в Python

Визначаючи абстрактний базовий клас, ви можете визначити загальний Інтерфейс прикладної програми (API) для набору підкласів. Ця можливість особливо корисна в ситуаціях, коли третя сторона збирається надавати впровадження, наприклад, із плагінами, але також може допомогти вам, коли працюєте у великій команді чи з великою кодовою базою, де важко чи ні важко зберегти всі класи в пам’яті. можливо.

Робота над абстрактними класами Python

За замовчуванням, Python не передбачає абстрактні класи . Python поставляється з модулем, який забезпечує основу для визначення A абстрактні базові класи (ABC) і це ім'я модуля ABC .



ABC працює шляхом оформлення методів базового класу як абстрактних, а потім реєстрації конкретних класів як реалізацій абстрактної бази. Метод стає абстрактним, якщо його прикрашають ключовим словом @abstractmethod.

Приклад 1:

Цей код визначає абстрактний базовий клас під назвою Багатокутник за допомогою модуля ABC (абстрактний базовий клас) у Python. Клас Polygon має абстрактний метод під назвою noofsides який має бути реалізований його підкласами.



Існує чотири підкласи багатокутника: трикутник, п’ятикутник, шестикутник і чотирикутник. Кожен із цих підкласів замінює метод noofsides і забезпечує власну реалізацію шляхом друку кількості сторін, які він має.

У коді драйвера створюються екземпляри кожного підкласу, і для кожного екземпляра викликається метод noofsides, щоб відобразити кількість сторін, характерних для цієї форми.

Python
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Polygon(ABC): @abstractmethod def noofsides(self): pass class Triangle(Polygon): # overriding abstract method def noofsides(self): print('I have 3 sides') class Pentagon(Polygon): # overriding abstract method def noofsides(self): print('I have 5 sides') class Hexagon(Polygon): # overriding abstract method def noofsides(self): print('I have 6 sides') class Quadrilateral(Polygon): # overriding abstract method def noofsides(self): print('I have 4 sides') # Driver code R = Triangle() R.noofsides() K = Quadrilateral() K.noofsides() R = Pentagon() R.noofsides() K = Hexagon() K.noofsides()>

Вихід
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

приклад 2:

Тут цей код визначає абстрактний базовий клас під назвою Animal за допомогою модуля ABC (абстрактний базовий клас) у Python. Клас Animal має неабстрактний метод під назвою move, який не має жодної реалізації. Виділяють чотири підкласи тварин: людина, змія, собака та лев. Кожен із цих підкласів замінює метод переміщення та забезпечує власну реалізацію, друкуючи певну характеристику переміщення.

Python
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Animal(ABC): def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') # Driver code R = Human() R.move() K = Snake() K.move() R = Dog() R.move() K = Lion() K.move()>

Вихід
I can walk and run I can crawl I can bark I can roar>

Реалізація реферату через підклас

Створюючи підклас безпосередньо з бази, ми можемо уникнути необхідності явно реєструвати клас. У цьому випадку для розпізнавання використовується керування класами Python Реалізація плагіна як реалізація анотація PluginBase .

Python
# Python program showing # implementation of abstract # class through subclassing import abc class parent: def geeks(self): pass class child(parent): def geeks(self): print('child class') # Driver code print( issubclass(child, parent)) print( isinstance(child(), parent))>

Вихід
True True>

Побічним ефектом використання прямого підкласу є те, що можна знайти всі реалізації вашого плагіна, запитавши у базового класу список відомих класів, похідних від нього.

Конкретні методи в абстрактних базових класах

Конкретні класи містять лише конкретні (звичайні) методи, тоді як абстрактні класи можуть містити як конкретні, так і абстрактні методи.

Конкретний клас забезпечує реалізацію абстрактних методів, абстрактний базовий клас також може забезпечити реалізацію, викликаючи методи через super(). Давайте розглянемо приклад виклику методу за допомогою super():

Python
# Python program invoking a  # method using super() from abc import ABC class R(ABC): def rk(self): print('Abstract Base Class') class K(R): def rk(self): super().rk() print('subclass ') # Driver code r = K() r.rk()>

Вихід
Abstract Base Class subclass>

У наведеній вище програмі ми можемо викликати методи в абстрактних класах за допомогою супер().

Абстрактні властивості в Python

Абстрактні класи включають атрибути на додаток до методів, ви можете вимагати атрибути в конкретних класах, визначивши їх за допомогою @abstractproperty.

Python
# Python program showing # abstract properties import abc from abc import ABC, abstractmethod class parent(ABC): @abc.abstractproperty def geeks(self): return 'parent class' class child(parent): @property def geeks(self): return 'child class' try: r = parent() print(r.geeks) except Exception as err: print(err) r = child() print(r.geeks)>

Вихід
Can't instantiate abstract class parent with abstract methods geeks child class>

У наведеному вище прикладі клас Base не може бути створений, оскільки він має лише абстрактну версію методу отримання властивостей.

Екземпляр абстрактного класу

Абстрактні класи є неповними, тому що вони мають методи, які не мають ніхто. Якщо Python дозволяє створити об’єкт для абстрактних класів, то використовувати цей об’єкт, якщо хтось викликає абстрактний метод, але фактичної реалізації для виклику немає.

Отже, ми використовуємо абстрактний клас як шаблон і відповідно до потреб розширюємо його та будуємо на ньому, перш ніж ми зможемо його використовувати. Через те, що абстрактний клас не є конкретним класом, його не можна створити. Коли ми створюємо об’єкт для абстрактного класу, це викликає помилку .

Python
# Python program showing # abstract class cannot # be an instantiation from abc import ABC,abstractmethod class Animal(ABC): @abstractmethod def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') c=Animal()>

Вихід:

Traceback (most recent call last): File '/home/ffe4267d930f204512b7f501bb1bc489.py', line 19, in c=Animal() TypeError: Can't instantiate abstract class Animal with abstract methods move>