C'è una domanda su Inherit docstrings in Python class inheritance, ma le risposte riguardano le docstring del metodo.Eredita una docstring della classe genitore come attributo __doc__
La mia domanda è come ereditare una docstring di una classe genitore come attributo __doc__
. Il caso è che Django rest framework genera una buona documentazione nella versione html dell'API basata sulle docstring delle classi di visualizzazione. Ma quando si eredita una classe base (con una docstring) in una classe senza una docstring, l'API non mostra la docstring.
Potrebbe benissimo essere che la sfinge e altri strumenti fanno la cosa giusta e gestiscono l'ereditarietà di doctring per me, ma il framework per il resto di django esamina l'attributo (vuoto) .__doc__
.
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"
Ho provato qualcosa di simile super(SubClassWithoutDocstring, self).__doc__
, ma che anche solo mi ha preso un None
.
Aggiungo solo ciò che ricordo delle discussioni che ho avuto su Python riguardo a questo. Di default non eredita le docstring perché è considerato che dal momento che Python non può sapere se la docstring sarebbe più significativa (anche se l'ereditarietà dovrebbe essere sufficiente per dire che il programmatore è in linea con il normale OOP per non cambiare completamente il significato di un oggetto), è stato considerato il caso in cui il doc era vuoto sarebbe stato meno fuorviante. Diventa più complesso dove la classe genitore è un ABC, per esempio ... –
Nel 3.3 il '__doc__'' getset_descriptor' è scrivibile per i tipi di heap. Prima aveva solo un 'getter' definito; ora ha il 'setter' [' type_set_doc'] (http://hg.python.org/cpython/file/bd8afb90ebf2/Objects/typeobject.c#l632). 'check_set_special_type_attr' impedisce l'eliminazione di' __doc__'. – eryksun
@eryksun: confermato; questa è una correzione che era in ritardo da tempo! Risuscitato la mia originale idea di decoratore di classe solo per Python 3.3. –