Я пытаюсь создать базовый класс и заставить все подклассы реализовать его интерфейс. Для этого я использую модуль abc
.Python ABC, кажется, разрешает неполную реализацию
Вот базовый класс:
class PluginBase:
__metaclass = abc.ABCMeta
@abc.abstractmethod
def strrep(self):
return
@abc.abstractmethod
def idle(self):
print 'PluginBase: doing nothing here'
pass
@abc.abstractmethod
def say(self, word):
print 'PluginBase: saying a word ''', word, '\''
return
А вот ребенок:
class ConcretePlugin(PluginBase):
def __init__(self, val):
print 'initialising ConcretePlugin with value of %d' % val
self.val = val
def strrep(self):
print 'ConcretePlugin = %d' % self.val
return
#'idle' method implementation is missing
def say(self): # missing argument here; saying our own word =)
print 'ConcretePlugin: this is my word'
return
Этот тест:
child = ConcretePlugin(307)
child.strrep()
child.idle()
child.say()
производит следующий результат:
initialising ConcretePlugin with value of 307
ConcretePlugin = 307
PluginBase: doing nothing here
ConcretePlugin: this is my word
Нет хныкания о неполной реализации!
Итак, мой вопрос в том, не абстрактны ли абстрактные базовые классы. И если они не тогда, это способ сделать надежную типизацию?
Примечание: я назвал примеры классов PluginBase
и CompletePlugin
, чтобы показать, что мне нужно, чтобы убедиться, что классы клиента реализовать соответствующий интерфейс.
Я попытался получить PluginBase
от object
, но это не имеет значения. Я использую Python 2.7.1
Любая помощь будет оценена по достоинству.
Спасибо! Оказывается, я задал еще один глупый вопрос! Я отмечу ответ как принятый, когда пройдет 7 минут, и мне разрешено это сделать :) – tonytony