我正在尝试使用注册表模式注册我用Flask-RESTFUL
定义的所有资源。
from flask_restful import Resource
class ResourceRegistry(type):
REGISTRY = {}
def __new__(cls, name, bases, attrs):
new_cls = type.__new__(cls, name, bases, attrs)
cls.REGISTRY[new_cls.__name__] = new_cls
return new_cls
@classmethod
def get_registry(cls):
return dict(cls.REGISTRY)
class BaseRegistered(object):
__metaclass__ = ResourceRegistry
class DefaultResource(BaseRegistered, Resource):
@classmethod
def get_resource_name(cls):
s = re.sub('(.)([A-Z][a-z]+)', r'\1-\2', cls.__name__)
return '/' + re.sub('([a-z0-9])([A-Z])', r'\1-\2', s).lower()
当整个过程启动时,我得到以下信息:
TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我尝试过使用代理类的层,但是结果仍然相同。那么有没有办法使用这种模式来注册我的资源?
最佳答案
您的DefaultResource
类似乎是从具有两个不同元类的类继承的:BaseRegistered
(具有元类ResourceRegistry
)和Resource
(具有Flask的MethodViewType
元类)。
This answer建议做类似的事情:
from flask.views import MethodViewType
class CombinedType(ResourceRegistry, MethodViewType):
pass
class BaseRegistered(object):
__metaclass__ = Combinedtype
然后像以前一样进行。
关于python - 如何对元类使用多重继承?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36152062/