不能在Python 3中使用抽象类(ABCMeta)

时间:2015-07-20 15:32:06

标签: python python-3.x abstract-class flask-restful

我正在使用SQLAlchemy创建一个Flask-RESTful应用程序。

我正在努力在Python 3中使用抽象类概念。根据python文档(https://docs.python.org/3/library/abc.html),用法应该简单如下:

### Python documentation ###
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(metaclass=ABCMeta):

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)

但是,在我在一个软件包中的实现中,我收到了以下错误:

档案:apis.base_api.py

class BaseAPI(metaclass=ABCMeta):

    @property
    @abstractmethod
    def entity(self):
        pass

    def checkId(self, unique_id):
        try:
            if not unique_id:
                abort(405)
            obj = self.entity.get_valid(int(unique_id))            
            if not obj:
                raise Exception('%s nao encontrado' % (self.__class__.__name__))
            return obj
        except:
            abort(404)
        ...

档案:apis.projects.py

class ProjectAPI(Resource):

    @property
    def entity(self):
        return Projeto #this is my model class object

    def get(self, unique_id=unique_id):
        obj self.checkId(unique_id)
        return {self.entity.__api_name__: obj.serialize()}
        #the return (tested before) is like {"projects": project.data})
    ...

file:apis .__ init __。py

from apis.base_api import BaseAPI
from apis.projects import ProjectAPI

BaseAPI.register(ProjectAPI)

我没有"汇编"错误,应用程序开始运行。当我尝试访问ProjectAPI时,我收到错误:

  

AttributeError:' ProjectAPI'对象没有属性' checkId'

自从我注册以来,BaseAPI.checkid方法是否应该被抽象地继承到ProjectAPI?我做错了什么?

提前Tnx

识别错误

从我的BaseAPI类创建ProjectAPI类(换句话说,我的Abstract类中的Concrete类)时,我应该使用Python 3语法,扩展Abstract类:

class ProjectAPI(BaseAPI, Resource):
...

并且应该不在BaseAPI上注册 ProjectAPI。

尽管如此,即使解决这个问题,下面的错误也会显示出来:

  

TypeError:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

0 个答案:

没有答案