आप केवल एक ही नहीं हैं! कुछ समय पहले इस बारे में comp.lang.python
पर एक चर्चा हुई थी, और एक नुस्खा बनाया गया था। इसे देखें here।
"""
doc_inherit decorator
Usage:
class Foo(object):
def foo(self):
"Frobber"
pass
class Bar(Foo):
@doc_inherit
def foo(self):
pass
Now, Bar.foo.__doc__ == Bar().foo.__doc__ == Foo.foo.__doc__ == "Frobber"
"""
from functools import wraps
class DocInherit(object):
"""
Docstring inheriting method descriptor
The class itself is also used as a decorator
"""
def __init__(self, mthd):
self.mthd = mthd
self.name = mthd.__name__
def __get__(self, obj, cls):
if obj:
return self.get_with_inst(obj, cls)
else:
return self.get_no_inst(cls)
def get_with_inst(self, obj, cls):
overridden = getattr(super(cls, obj), self.name, None)
@wraps(self.mthd, assigned=('__name__','__module__'))
def f(*args, **kwargs):
return self.mthd(obj, *args, **kwargs)
return self.use_parent_doc(f, overridden)
def get_no_inst(self, cls):
for parent in cls.__mro__[1:]:
overridden = getattr(parent, self.name, None)
if overridden: break
@wraps(self.mthd, assigned=('__name__','__module__'))
def f(*args, **kwargs):
return self.mthd(*args, **kwargs)
return self.use_parent_doc(f, overridden)
def use_parent_doc(self, func, source):
if source is None:
raise NameError, ("Can't find '%s' in parents"%self.name)
func.__doc__ = source.__doc__
return func
doc_inherit = DocInherit
स्रोत
2010-01-08 04:51:35
यह अभिभावक वर्ग 'विधि के डॉक्स्टिंग के उत्तराधिकारी के लिए एक विधि के लिए साफ है। यह मुझे लगता है कि कई मामलों में उपयोगी होगा। मैं पूरी कक्षा के लिए डॉकस्ट्रिंग के बारे में और सोच रहा था, जहां मैं उत्तराधिकारी और संलग्न होना चाहता हूं। –
आह, गोचा। उस स्थिति में, अधिकांश डॉक्टर-पीढ़ी पहले से ही आपके लिए ऐसा करती है। –