2012-05-25 8 views
1

Я пытаюсь создать базовый класс и заставить все подклассы реализовать его интерфейс. Для этого я использую модуль 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

Любая помощь будет оценена по достоинству.

ответ

2

Изменение __metaclass по __metaclass__. В противном случае это обычный скрытый атрибут.

>>> ConcretePlugin(123) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't instantiate abstract class ConcretePlugin with abstract methods idle 
+0

Спасибо! Оказывается, я задал еще один глупый вопрос! Я отмечу ответ как принятый, когда пройдет 7 минут, и мне разрешено это сделать :) – tonytony

 Смежные вопросы

  • Нет связанных вопросов^_^