在Python2.7-abc模块中考虑类属性的抽象方法

在Python2.7-abc模块中考虑类属性的抽象方法,python,python-2.7,lxml,abc,Python,Python 2.7,Lxml,Abc,我试图用一个抽象方法(addfeature)实现一个抽象超类(Base),子类将覆盖它 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={'

我试图用一个抽象方法(addfeature)实现一个抽象超类(Base),子类将覆盖它

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:无法用抽象类实例化抽象类子级 方法“em”


为什么??em应该是一个类属性,而不是一个方法(当然也不是一个抽象方法)

ABCMeta
使用
\uu isastractmethod\uuu
属性检查该方法是否抽象。
lxml.builder.ElementMaker
动态生成一个方法(使用);访问
\uu isastractmethod\uu
会混淆
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
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