我正在尝试使用注册表模式注册我用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/

10-15 17:12