Абстрактные методы в ООП в Python
Абстрактные классы также могут содержать абстрактные методы. Такие методы не должны иметь реализации, а нужны для того, чтобы указать, что такие методы должны быть у потомков. А собственно реализация таких методов - уже задача потомков.
В Python над методом ставят декоратор
@abstractmethod.
Давайте попробуем на практике. Пусть предполагается,
что все потомки класса User должны
иметь метод increase_revenue.
Этот метод должен брать текущий доход пользователя и увеличивать его на некоторую величину, переданную параметром.
Сам класс User не знает, какой именно
доход будет получать наследник - ведь у работника
это зарплата, а у студента - стипендия. Поэтому
каждый потомок будет реализовывать этот метод
по-своему.
Суть тут в том, что абстрактный метод класса
User заставляет программиста реализовывать
этот метод в потомках, иначе Python выдаст ошибку
при создании объекта потомка.
Таким образом вы, или другой программист,
работающий с вашим кодом, никак не сможете
забыть реализовать нужный метод
в потомке.
Итак, давайте попробуем на практике. Добавим
абстрактный метод increase_revenue
в класс User:
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
# Абстрактный метод без тела:
@abstractmethod
def increase_revenue(self, value):
pass
Пусть наш класс Employee пока останется
без реализации increase_revenue.
Попытка создать объект такого класса
выдаст ошибку.
Давайте теперь напишем реализацию метода
increase_revenue в классе
Employee:
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
# Напишем реализацию метода:
def increase_revenue(self, value):
self.__salary = self.__salary + value
Проверим работу нашего класса:
employee = Employee()
employee.set_name('john')
employee.set_salary(1000)
employee.increase_revenue(100)
print(employee.get_salary())
Реализуем метод increase_revenue и
в классе Student. Toлько теперь наш
метод будет увеличивать уже стипендию:
class Student(User):
def __init__(self):
super().__init__()
self.__scholarship = None # стипендия
def show(self):
return self.get_name()
def get_scholarship(self):
return self.__scholarship
def set_scholarship(self, scholarship):
self.__scholarship = scholarship
# Метод увеличивает стипендию:
def increase_revenue(self, value):
self.__scholarship = self.__scholarship + value
Добавьте в ваш класс User такой же
абстрактный метод increase_revenue.
Напишите реализацию этого метода в классах
Employee и Student.
В классе Figure сделайте абстрактные
методы для получения площади и периметра фигуры.