Да. Это можно сделать с помощью метакласса или начиная с Python 3.6 и далее, с помощью проверки __init_subclass__
базового класса.
__init_sublass__
- это специальный метод, вызываемый языком каждый раз, когда создается экземпляр подкласса. , Таким образом, он может проверить, есть ли у нового класса какой-либо метод, которого нет ни в одном из суперклассов, и вызвать TypeError, когда подкласс объявлен. (__init_subclass__
преобразуется в метод класса автоматически)
class Base(ABC):
...
def __init_subclass__(cls, *args, **kw):
super().__init_subclass__(*args, **kw)
# By inspecting `cls.__dict__` we pick all methods declared directly on the class
for name, attr in cls.__dict__.items():
attr = getattr(cls, name)
if not callable(attr):
continue
for superclass in cls.__mro__[1:]:
if name in dir(superclass):
break
else:
# method not found in superclasses:
raise TypeError(f"Method {name} defined in {cls.__name__} does not exist in superclasses")
Обратите внимание, что в отличие от TypeError, вызываемого не реализованными абстрактными методами, эта ошибка возникает во время объявления класса, а не во время создания класса. Если более поздний вариант желателен, вы должны использовать метакласс и перенести проверку в его метод __call__
- однако это усложняет ситуацию, как если бы один метод создавался в промежуточном классе, который никогда не создавался, он не будет вызываться, когда метод доступен в листовом подклассе. Я думаю, что вам нужно больше по приведенному выше коду.