<p>实际上,<code>test</code>是一个返回字符串的属性。您必须<em>子类</em><code>str</code>,并给它一个<code>__doc__</code>属性:</p>
<pre><code>class docstring_str(str):
def __new__(cls, v, __doc__=''):
s = super(docstring_str, cls).__new__(cls, v)
s.__doc__ = __doc__
return s
</code></pre>
<p>演示:</p>
^{pr2}$
<p>用作:</p>
<pre><code>class A(object):
@classproperty
def test(cls):
return docstring_str("Test", "docstring')
</code></pre>
<p>因为<code>str</code>对象是不可变的,所以您不能在decorator中设置<code>__doc__</code>属性。您必须返回一个proxy对象,它完全包装除了<code>__doc__</code>属性之外的实际返回值。这很快就会变得复杂和丑陋。在</p>
<p>另一种方法是在元类</em>上添加一个正则的<code>property</code><em>;该类的类:</p>
<pre><code>class MetaClass(type):
@property
def test(cls):
"docstring"
return "Test"
class A(object):
__metaclass__ = MetaClass
</code></pre>
<p>现在,<code>A</code>有一个<code>test</code>属性,docstring可以作为<code>MetaClass.test.__doc__</code>或使用<code>type(A).test.__doc__</code>访问:</p>
<pre><code>>>> A.test
'Test'
>>> type(A).test
<property object at 0x10757d158>
>>> type(A).test.__doc__
'docstring'
</code></pre>