Предположим, что я определяю абстрактный базовый класс следующим образом:
from abc import abstractmethod, ABCMeta
class Quacker(object):
__metaclass__ = ABCMeta
@abstractmethod
def quack(self):
return "Quack!"
Это гарантирует, что любой класс, полученный из Quacker
, должен реализовать метод quack
. Но если я определяю следующее:
class PoliteDuck(Quacker):
def quack(self, name):
return "Quack quack %s!" % name
d = PoliteDuck() # no error
Мне разрешено создавать экземпляр класса, потому что я предоставил метод quack
, но сигнатуры функций не совпадают. Я вижу, как это может быть полезно в некоторых ситуациях, но я заинтересован в том, чтобы я мог определенно назвать абстрактные методы. Это может привести к сбою, если сигнатура функции отличается!
Итак: как я могу применить соответствующую подпись функции? Я бы ожидал ошибку при создании объекта, если подписи не совпадают, точно так же, как если бы я не определил его вообще.
Я знаю, что это не идиоматично, и что Python - неправильный язык, который нужно использовать, если я хочу получить такие виды гарантий, но это не так, возможно ли это?