Es gibt eine Frage über Inherit docstrings in Python class inheritance, aber die Antworten dort befassen sich mit Methode Docstrings.Vererben Sie eine übergeordnete Klasse docstring als __doc__ Attribut
Meine Frage ist, wie man einen Docstring einer Elternklasse als __doc__
Attribut erbt. Der Anwendungsfall ist, dass Django rest framework nette Dokumentation in der HTML-Version Ihrer API basierend auf den Docstrings Ihrer Ansichtsklassen generiert. Wenn Sie jedoch eine Basisklasse (mit einem Docstring) in einer Klasse ohne Docstring erben, zeigt die API den Docstring nicht an.
Es kann sehr gut sein, dass Sphinx und andere Tools das Richtige tun und die Docstring-Vererbung für mich behandeln, aber django Rest Framework schaut auf das (leere) .__doc__
Attribut.
class ParentWithDocstring(object):
"""Parent docstring"""
pass
class SubClassWithoutDoctring(ParentWithDocstring):
pass
parent = ParentWithDocstring()
print parent.__doc__ # Prints "Parent docstring".
subclass = SubClassWithoutDoctring()
print subclass.__doc__ # Prints "None"
Ich habe so etwas wie super(SubClassWithoutDocstring, self).__doc__
versucht, aber dass auch hat mich nur ein None
.
Ich füge nur etwas hinzu, woran ich mich erinnere, über die Diskussionen, die ich bezüglich Python darüber geführt habe. Es erbt Docstrings nicht standardmäßig, weil Python nicht wissen kann, ob der Docstring mehr Bedeutung hat (obwohl Vererbung ausreichen sollte, um zu bedeuten, dass der Programmierer sich an die normale OOP hält, um die Bedeutung von Objekt), es wurde der Fall angenommen, wo das Dokument leer war, würde weniger falsch führen. Es wird komplexer, wenn die Elternklasse zum Beispiel ein ABC ist ... –
In 3.3 ist der '__doc__'' getset_descriptor' nun beschreibbar für Heap-Typen. Zuvor hatte es nur einen "Getter" definiert; jetzt hat es den 'setter' [type_set_doc'] (http://hg.python.org/cpython/file/bd8afb90ebf2/Objects/typeobject.c# l632). 'check_set_special_type_attr 'verhindert das Löschen von' __doc__'. – eryksun
@eryksun: Bestätigt; Das ist eine Lösung, die längst überfällig war! Meine ursprüngliche Klasse Dekorateur Idee nur für Python 3.3 wiederbelebt. –