Рассмотрим следующий пример:
class A:
"""
Simple
:param a: parameter a explained
"""
def __init__(self, a):
self._a = a
class B(A):
def __init__(self, a, b):
"""
More complicated
:param a: parameter a explained. <- repetition here
:param b: parameter b explained.
"""
super().__init__(a) # this call will have to change if `A()` does
self._b = b
class C(A):
def __init__(self, *args, c, **kwargs):
"""
More complicated without repetition of documentation
:param c: parameter c explained.
"""
super().__init__(*args, **kwargs)
self._c = c
Что я часто делаю при подклассе, так это то, что происходит для B
: повторение документации для A
(его суперкласса).
Причина, по которой я это делаю, заключается в том, что если вы этого не сделаете, например, для C
, IDE и инструменты документации не могут разрешить полную подпись конструктора и будут предоставлять только подсказки для новых функций, скрывая документацию суперкласса, который все еще применяется. , хотя он работает, как ожидалось.
Чтобы избежать повторения, как в B
, как лучше всего в Python создать подкласс для какого-либо другого класса, добавив параметр в конструктор, без необходимости повторять всю документацию суперкласса в подклассе?
Другими словами: как я могу написать класс B
, чтобы подсказки параметров в IDE позволяли пользователям этого класса видеть, что он принимает a
и b
в качестве параметра, без повторного указания всех других параметров, кроме нового b
? б>
В данном случае, конечно, это не так уж важно, хотя даже здесь, если подпись конструктора A
s изменится позже, документация для B
также должна быть обновлена. Но для более сложных классов с большим количеством параметров проблема становится более серьезной.
Кроме того, если подпись A
изменяется, вызов super().__init__()
в конструкторе B
s также должен измениться, в то время как C
продолжает работать до тех пор, пока нет конфликтов (т.е. новый параметр A
s в конструкторе также не вызывается c
).
super
, сворачивается / дублируется в текущую функцию), нет. Альтернативные методы: вы можете попытаться создать какой-либо метакласс, который будет манипулировать всеми входными вызываемыми объектами таким образом, чтобы у них был правильный__doc__
(но это не решает проблему IDE), или посредством генерации какого-либо шаблона кода. Поскольку IDE Python, как правило, полагаются на статические записи внутри исходных файлов, Python не имеет врожденной концепции наследования строк документации (хотя инструменты docgen, такие как sphinx, эмулируют ее). - person metatoaster   schedule 22.04.2021