Python Glossary English

все Python 3ООПпонятие

Абстрактные классы

ABC

abc.ABC и @abstractmethod запрещают создание экземпляров класса без реализации всех абстрактных методов.

Синтаксис

from abc import ABC, abstractmethod
class Shape(ABC):
    @abstractmethod
    def area(self): ...

@abstractmethod запрещает создание экземпляров только если класс действительно наследует ABC (или задан metaclass=ABCMeta) — сам по себе декоратор ничего не блокирует. Ошибка возникает в момент вызова конструктора, а не при определении класса.

Примеры

from abc import ABC, abstractmethod
class Shape(ABC):
    @abstractmethod
    def area(self) -> float:
        pass
    @abstractmethod
    def perimeter(self) -> float:
        pass
class Circle(Shape):
    def __init__(self, r):
        self.r = r
    def area(self):
        import math
        return math.pi * self.r**2
    def perimeter(self):
        import math
        return 2 * math.pi * self.r
print(round(Circle(5).area(), 2))  # → 78.54
# TypeError при попытке создать экземпляр ABC
try:
    Shape()
except TypeError as e:
    print(e)  # → Can't instantiate abstract class Shape...
from abc import ABC, abstractmethod
class Animal(ABC):
    @abstractmethod
    def speak(self) -> str:
        pass
    def describe(self):
        return f'I say: {self.speak()}'
class Dog(Animal):
    def speak(self):
        return 'Woof!'
print(Dog().describe())  # → I say: Woof!
# Абстрактное свойство
class Base(ABC):
    @property
    @abstractmethod
    def name(self) -> str:
        pass
class Concrete(Base):
    @property
    def name(self):
        return 'Concrete'
print(Concrete().name)  # → Concrete
# ABCMeta без ABC
from abc import ABCMeta
class Interface(metaclass=ABCMeta):
    @abstractmethod
    def process(self): pass
class Impl(Interface):
    def process(self): return 'done'
print(Impl().process())  # → done
# isinstance с ABC
print(isinstance(Dog(), Animal))  # → True
print(issubclass(Dog, Animal))    # → True

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности