Do c string из родительского класса в функции дочернего класса - PullRequest
1 голос
/ 05 марта 2020

У меня есть приложение Django==2.2.3 с djangorestframework==3.9.4 и django-rest-swagger==2.2.0. Я хотел иметь единый источник правды (для проверки данных, а также api-docs) для моих конечных точек API. У меня есть 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 в строки do c. Но я не хочу go и писать одно и то же для каждой вещи. Будет много конечных точек, и писать одно и то же для всех этих конечных точек будет неправильно.

Поэтому я решил, что если я создам базовый класс и просто отправлю json этому базовому классу, он может создать все строки do c для меня, используя json и динамически помещая его в требуемые функции. Теперь я сталкиваюсь с блокировщиком, и он говорит.

AttributeError: атрибут '__ do c __' объектов 'method' недоступен для записи

Вот как мой класс выглядит так:

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: атрибут __ do c __ объектов метода не доступен для записи

Вопрос : Как изменить строку документации функции детского класса из родительского класса?

1 Ответ

1 голос
/ 05 марта 2020

Вы можете определить его в методе __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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...