2014-12-17 3 views
3

추상 메소드 (addfeature)로 추상 수퍼 클래스 (Base)를 구현하려고하는데,이 클래스는 Child 클래스가 재정의합니다.파이썬에서 추상 메소드로 간주되는 클래스 속성 2.7 - abc 모듈

from lxml.builder import ElementMaker 
from abc import ABCMeta, abstractmethod 

class Base(object): 
    __metaclass__ = ABCMeta 

    ns = "http://www.foo.com/bar" 
    em = ElementMaker(namespace=ns, nsmap={'bar': ns}) 

    @abstractmethod 
    def addfeature(self): 
     pass 

class Child(Base): 
    def addfeature(self): 
     pass 

child_instance = Child() 

이 코드는

"TypeError: Can't instantiate abstract class Child with abstract methods em"

이유와 그러나 실패? em은 메소드가 아니라 클래스 속성이어야한다. (확실한 것은 추상적 인 메소드가 아님)

답변

3

ABCMeta__isabstractmethod__ 속성을 사용하여 메소드가 추상 메소드인지 여부를 점검한다. lxml.builder.ElementMaker은 (__getattr__을 사용하여) 동적으로 메소드를 생성합니다. __isabstractmethod__에 액세스하면 ABCMeta을 혼동합니다.

>>> ns = "http://www.foo.com/bar" 
>>> em = ElementMaker(namespace=ns, nsmap={'bar': ns}) 
>>> em.child_element 
<functools.partial object at 0x0000000002B55598> 
>>> em.child_element() 
<Element {http://www.foo.com/bar}child_element at 0x27a8828> 
>>> em.__isabstractmethod__ 
<functools.partial object at 0x0000000002B55598> 
>>> bool(em.__isabstractmethod__) 
True 

False__isabstractmethod__을 할당하여, 당신은 그것을 해결할 수 있습니다.

class Base(object): 
    __metaclass__ = ABCMeta 

    ns = "http://www.foo.com/bar" 
    em = ElementMaker(namespace=ns, nsmap={'bar': ns}) 
    em.__isabstractmethod__ = False # <----- 

    @abstractmethod 
    def addfeature(self): 
     pass 
+0

명확한 설명과 솔루션을 제공해 주셔서 감사합니다. –

관련 문제