Посмотрите на Абстрактные базовые классы , поскольку они обеспечат более точный контроль над тем, как создаются экземпляры подклассов, если это то, что вы действительно хотите сделать.
В целом, это может быть допустимым использованием, потому что вы не препятствуете me передавать все, что I хочет в ваш код, но я все равно не буду считать его пифоническим. Вы говорите мне , что Я не может создать экземпляр вашего класса. Что если я захочу?
Используя ABC, это выглядит так:
import abc
class O(object):
__metaclass__ = abc.ABCMeta
def __init__(self, name):
self.name = name
@abc.abstractmethod
def fn(self):
pass
Преимущество в том, что вы не разбиваете супер на методе fn
. Как у вас с raise NotImplementedError
, вы нарушаете супер для множественного наследования. Если класс наследуется от двух классов, которые подкласс O
и оба вызывают super (как они должны учитывать множественное наследование), то он создаст исключение, которое вы вызываете.
Итак, теперь вы не просто говорите мне, что я не могу создать экземпляр вашего класса, вы говорите, что я не могу использовать множественное наследование при создании подклассов из вашего класса.