Возможно ли в Python объявить, что метод должен быть переопределен?

У меня есть "абстрактный" класс, например:

class A:
    def do_some_cool_stuff():
        ''' To override '''
        pass

    def do_some_boring_stuff():
        return 2 + 2

И класс B, подклассы A:

class B(A):
    def do_stuff()
        return 4

Можно ли объявить, что метод A.do_some_cool_stuff должен быть переопределен, и, возможно, что при попытке создать объект класса B необходимо создать некоторое предупреждение, если B не реализовал A.do_some_cool_stuff?

Ответ 1

Да, определяя A как ABC (абстрактный базовый класс):

from abc import ABCMeta, abstractmethod

class A(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def do_some_cool_stuff():
        ''' To override '''
        pass

    def do_some_boring_stuff():
        return 2 + 2

Вы можете подклассом A, но вы можете создавать экземпляры такого подкласса только в том случае, если метод do_some_cool_stuff() имеет конкретную реализацию:

>>> from abc import ABCMeta, abstractmethod
>>> class A(object):
...     __metaclass__ = ABCMeta
...     @abstractmethod
...     def do_some_cool_stuff():
...         ''' To override '''
...         pass
...     def do_some_boring_stuff():
...         return 2 + 2
... 
>>> class B(A):
...     def do_stuff():
...         return 4
... 
>>> B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class B with abstract methods do_some_cool_stuff