1

我有一个Django==2.2.3带有djangorestframework==3.9.4and的应用程序django-rest-swagger==2.2.0。我想为我的 api 端点提供单一的事实来源(用于数据验证和 api-docs)。我有一个看起来像这样的 JSON

{
    "get": {
        "query_param1" : {
            "type": "string",
            "required": "false",
            "message": "what does it do/what is it for?"
        },
        "query_param2" : {...},
        "responseMessages": {
            "code: 401": "Not authenticated",
            "code: 403": "Insufficient rights to call this procedure"
        }
    },
    "delete": {
        "query_param1" : {...},
        "query_param2" : {...},
        "responseMessages": {...},
    },
    "put": {...},
    "post": {...},
}

我从中创建了一个 json 模式,并且验证正在工作。

此 json 转换为 yaml 字符串,供django-rest-swagger. 它是如何使用 yaml 的,您需要将 yaml 放在 doc 字符串中。但我不想为每件事都写同样的东西。会有很多端点,并且为所有这些端点编写相同的东西感觉不对。

所以我想如果我创建一个基类并将 json 发送到该基类,它可以为我创建所有 doc 字符串,使用 json 并将其动态地放入所需的函数中。我现在面对一个拦截器,它说。

AttributeError:“方法”对象的属性“__ doc __”不可写

这就是我的班级的样子

class Parent:
  def __init__(self):
    schema = json.load(schema_path)
    self.get.__doc__ = convertToYaml(schema['get'])
    **ERROR HERE: AttributeError: attribute '__doc__' of 'method' objects is not writable**


class Child(Parent)
  def get(self):
    JsonResponse({message: "Hi! I work fine" })

TLDR:

获得的错误:AttributeError:方法对象的属性 __ doc __ 不可写

问题:如何从父类更改子类函数的文档字符串?

4

1 回答 1

1

您可以在父母的__new__方法中定义它。

这是一个如何覆盖它的简单示例。

class Parent(object):
    """ This is the Parent"""
    def __new__(cls):
        cls.__init__.__doc__ = cls.__bases__[0].__doc__
        return object.__new__(cls)

    def __init__(self):
        print('hello')


class Child(Parent):
    """ This is the Child """
    def __init__(self):
        super().__init__()

test = Child()

print(test.__init__.__doc__)

在您的示例中,它将是这样的:

class Parent(object):
    def __new__(cls):
        schema = json.load(schema_path)
        cls.get.__doc__ = convertToYaml(schema['get'])
        return object.__new__(cls)
于 2020-03-05T17:52:55.740 回答