Как добавить константную строку в __doc__ для всех методов класса?

У меня есть код, который выглядит так:

constString = """
Default docstring info:
    1
    2
    3"""

class A():

    def A1():
        """
        First unique docstring.
        """
        pass

    def A2():
        """
        Second unique docstring.
        """
        pass
B = A()
print(B.A1.__doc__)

Если я запускаю этот код, я получаю вывод:

First unique docstring.

Second unique docstring.

Но я хочу заменить строку документации метода, добавив constString для всех методов в классе А. Вывод должен выглядеть следующим образом:

First unique docstring.
Default docstring info:
1
2
3

Second unique docstring.
Default docstring info:
1
2
3

Как я могу это сделать?

2 ответа

Решение

Строка документации метода экземпляра берется из базовой функции, поэтому B.A1.__doc__ += constString не работает Тем не мение:

B.A1.__func__.__doc__ += constString

Строки документации функций доступны для записи; просто назначьте function.__doc__; Вот декоратор, который добавляет строку в строку документации всех методов класса:

import inspect

def add_documentation(doc):
    if not doc.startswith('\n'):
        doc = '\n' + doc

    def decorator(cls):
        for func in filter(inspect.isfunction, vars(cls).values()):
            func.__doc__ += doc
        return cls

    return decorator

Используйте это так:

@add_documentation(constString)
class A:
    def A1(self):
        """
        First unique docstring.
        """
        pass

    def A2(self):
        """
        Second unique docstring.
        """
        pass

Декоратор работает как в Python 2, так и в 3 и влияет только на методы, определенные непосредственно в классе, а не в каких-либо базовых классах.

Другие вопросы по тегам