[英]class attribute considered abstract method in python 2.7 - abc module
我試圖用抽象方法(addfeature)實現一個抽象超類(Base),Child類將覆蓋它。
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實例化抽象類Child”
為什么? em應該是一個類屬性,而不是一個方法(當然不是一個抽象方法)
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
通過將__isabstractmethod__
指定為False
,您可以解決它。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.