我正在使用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:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类