2012-05-25 2 views
1

나는 기본 클래스를 만들고 모든 하위 클래스의 인터페이스를 구현하도록하고있다. 이 목적으로 abc 모듈을 사용하고 있습니다. 여기 파이썬 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 

이 테스트 :

,536,913 :

child = ConcretePlugin(307) 
child.strrep() 
child.idle() 
child.say() 

는 다음과 같은 결과를 생성

불완전한 구현에 대해 아무렇지도 않게 표현하십시오!

제 질문은 추상 기본 클래스가 실제로 추상이 아닌지 여부입니다. 그리고 그들이 그렇지 않다면 강력한 타이핑을 만드는 어떤 방법이 있습니까?

참고 : 나는라는 이름의 한 예 클래스 PluginBaseCompletePlugin 내가 클라이언트 클래스가 적절한 인터페이스를 구현해야 할 필요가 있음을 표시합니다.

나는 object에서 PluginBase을 파생 시키려고 시도했으나 아무런 차이가 없습니다. 파이썬 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

관련 문제