все Python 3abcпонятие
abc.ABCMeta
абстрактные классы
Метакласс для определения абстрактных базовых классов; ABC — удобная обёртка над ним.
Синтаксис
class C(metaclass=abc.ABCMeta): ...
Прямо к метаклассу обращаются, когда наследоваться от ABC нельзя: у класса уже есть свой метакласс, и его делают наследником ABCMeta. Вторая причина — метод register(): чужой класс объявляется виртуальным подклассом, после чего isinstance и issubclass отвечают True, но ничего не наследуется и абстрактные методы у него никто не проверяет.
Примеры
import abc
print(type(abc.ABC) is abc.ABCMeta) # → True
import abc
class Shape(metaclass=abc.ABCMeta):
@abc.abstractmethod
def area(self): return 0
print(type(Shape) is abc.ABCMeta) # → True
print(Shape.__abstractmethods__) # → frozenset({'area'})
class Circle(Shape): area = lambda self: 3.14
print(Circle().area()) # → 3.14
print(Shape()) # → TypeError
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности