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