簡體   English   中英

class屬性在python 2.7中被認為是抽象方法 - abc模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM