<p>请改用类修饰符:</p>
<pre><code>@inherit_docstrings
class MyClass(SuperClass):
def method(self):
pass
</code></pre>
<p>其中<code>inherit_docstrings()</code>定义为:</p>
^{pr2}$
<p>演示:</p>
<pre><code>>>> class SuperClass:
... def method(self):
... '''Has a docstring'''
... pass
...
>>> @inherit_docstrings
... class MyClass(SuperClass):
... def method(self):
... pass
...
>>> MyClass.method.__doc__
'Has a docstring'
</code></pre>
<p>这将在定义整个类之后设置docstring<em>,而不必首先创建实例。在</p>
<p>如果您需要方法装饰器可以使用的docstring,那么不幸的是,您只能使用复制父类的decorator。在</p>
<p>这样做的原因是,在定义类主体时,不能反思超类将是什么。类定义期间的本地命名空间无权访问传递给类工厂的参数。在</p>
<p>您可以使用元类将基类添加到本地名称空间,然后使用修饰符再次拉出基类,但在我看来,这会变得丑陋、快速:</p>
<pre><code>import sys
class InheritDocstringMeta(type):
_key = '__InheritDocstringMeta_bases'
def __prepare__(name, bases, **kw):
return {InheritDocstringMeta._key: bases}
def __call__(self, name, bases, namespace, **kw):
namespace.pop(self._key, None)
def inherit_docstring(func):
bases = sys._getframe(1).f_locals.get(InheritDocstringMeta._key, ())
for base in bases:
for parent in base.mro():
if hasattr(parent, func.__name__):
func.__doc__ = getattr(parent, func.__name__).__doc__
return func
</code></pre>
<p>演示用法:</p>
<pre><code>>>> class MyClass(SuperClass, metaclass=InheritDocstringMeta):
... @inherit_docstring
... def method(self):
... pass
...
>>> MyClass.method.__doc__
'Has a docstring'
</code></pre>