Абстрактные классы - это классы, которые предназначены для наследования, но избегают реализации конкретных методов, оставляя только сигнатуры методов, которые должны реализовывать подклассы.
from abc import ABCMetaclassAbstractClass(object):# атрибут метакласса всегда должен # быть установлен как переменная класса __metaclass__= ABCMeta# декоратор abstractmethod регистрирует этот метод как undefined@abstractmethoddefvirtual_method_subclasses_must_define(self):# Можно оставить полностью пустым# или предоставить базовую реализацию# Обратите внимание, что обычно пустая интерпретация# неявно возвращает `None`, но при регистрации# это поведение больше не применяется.123456789101112131415
Когда мы создаем объект и называем это два метода, мы получим ошибку (как и ожидалось) с punchline() метод.
sketch =ArgumentClinic()sketch.punchline()# AttributeError: 'ArgumentClinic' object has no attribute 'punchline'1234
Этого можно избежать, используя модуль Abstract Base Class (ABC).
from abc import ABCMeta, abstractmethodclassMontyPython(metaclass=ABCMeta):@abstractmethoddefjoke(self):pass@abstractmethoddefpunchline(self):pass# у наследуемого класса 2 @abstractmethod, а мы использовали только одинclassArgumentClinic(MontyPython):defjoke(self):return"Hahahahahah"c =ArgumentClinic()# TypeError: "Can't instantiate abstract class ArgumentClinic with abstract methods punchline"12345678910111213141516
На этот раз, когда мы пытаемся создать экземпляр объекта из неполного класса, мы немедленно получаем TypeError!
classArgumentClinic(MontyPython):defjoke(self):return"Hahahahahah"defpunchline(self):return"Send in the constable!"c =ArgumentClinic()c # <__main__.ArgumentClinic object at 0x7fee680d3640>1234567891011