Абстрактные классы в ООП в Python
Пусть у вас есть класс User, а от
него наследуют классы Employee и
Student.
При этом предполагается, что вы будете создавать
объекты классов Employee и Student,
но объекты класса User - не будете,
так как этот класс используется только для
группировки общих свойств и методов своих
наследников.
В этом случае можно принудительно запретить
создавать объекты класса User, чтобы
вы или другой программист где-нибудь их случайно
не создали.
Для этого существуют так называемые абстрактные классы. Абстрактные классы представляют собой классы, предназначенные для наследования от них. При этом объекты таких классов нельзя создать.
В Python класс делают абстрактным, если он
наследует ABC из модуля abc:
from abc import ABC
class User(ABC):
pass # абстрактный класс
Итак, давайте напишем реализацию абстрактного
класса User. Пусть у него будет приватное
свойство name, а также геттеры и сеттеры
для него:
from abc import ABC, abstractmethod
class User(ABC):
def __init__(self):
self.__name = None
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
@abstractmethod
def show(self):
pass
Попытка создать объект класса User
вызовет ошибку:
user = User() # выдаст ошибку
А вот унаследовать от нашего класса будет
можно. Сделаем класс Employee, который
будет наследовать от нашего абстрактного
класса User:
class Employee(User):
def __init__(self):
super().__init__()
self.__salary = None
def show(self):
return self.get_name()
def get_salary(self):
return self.__salary
def set_salary(self, salary):
self.__salary = salary
Создадим объект класса Employee -
все будет работать:
employee = Employee()
employee.set_name('john') # метод родителя, т.е. класса User
employee.set_salary(1000) # свой метод, т.е. класса Employee
print(employee.get_name()) # выведет 'john'
print(employee.get_salary()) # выведет 1000
Сделайте абстрактный класс Figure,
представляющий собой геометрическую
фигуру. Пусть от него наследует классы
для круга, прямоугольника и квадрата.