Python 使用sphinx';s autodoc

Python 使用sphinx';s autodoc,python,python-sphinx,autodoc,Python,Python Sphinx,Autodoc,我有一门课是这样的: class MyBase(object): x = 3 """Documentation for property x""" 以及继承它的另一个类: class MyObj(MyBase): x = 0 当我使用sphinx的autodoc生成文档时,MyObj.x没有文档。有没有办法从MyBase.x继承docstring?我发现,但由于它使用了装饰器,所以它只适用于类方法。有没有办法用属性来实现这一点?据我所知,属性的docstring不是Pyth

我有一门课是这样的:

class MyBase(object):
   x = 3
   """Documentation for property x"""
以及继承它的另一个类:

class MyObj(MyBase):
   x = 0

当我使用sphinx的autodoc生成文档时,
MyObj.x
没有文档。有没有办法从
MyBase.x
继承docstring?我发现,但由于它使用了装饰器,所以它只适用于类方法。有没有办法用属性来实现这一点?

据我所知,属性的docstring不是Python的一部分。当我尝试它时,
MyBase.x.\uuuuu doc\uuuuu
不会设置为它下面的字符串。docstring只对类、函数和方法起作用。如果Sphinx将
x=3
下面的字符串作为docstring提取,则它可能正在对源代码进行自己的处理以获得该字符串。

我使用属性函数找到了一个解决方法:

class MyBase(object):
   _x = 3
   x = property( lambda s: s._x, doc="Documentation for property x")

class MyObj(MyBase):
   _x = 0
这很好,因为给定了一个实例变量:

>>> m = MyObj()
>>> m.x
0

您可以调用
help(m)
并获得属性
x的正确文档,sphinx也正确地识别了这一点。

正如Thomas已经指出的,属性在Python中没有docstring。然而,Sphinx提供了自己的处理,允许记录属性

class Test(object):
    #: This is an attibute docstring.
    test_attr = 'test'

    @property
    def test_prop(self):
        """This is a property docstring."""
这导致:

class Test
    Bases: object

    test_attr = 'test'
        This is an attibute docstring.

    test_prop
        This is a property docstring.

如果您只关心通过Sphinx创建文档。您可以使用: “:继承的成员:”

这还将在Sphinx文档中添加继承成员的文档字符串


这让我觉得应该将
property()
doc
参数一起使用。看看我的答案。这有点难看,但我认为这可能是最好的方法,除非你有更好的建议。@jterrace:我当然不想为了添加docstring而把x变成一个带有getter的属性。我不认为有其他方法可以做到这一点,但我通常不使用docstring来保留属性,或者在类“docstring”中描述重要的属性。@Thomas-K:我同意,但另一种方法是复制docstring,这使得维护文档非常烦人。不要过多地猜测您,但是。。。您的文档具有继承树。为什么
MyObj
的用户不单击链接转到父对象,然后在那里查看父对象的文档呢?这是一种可能性,但我认为将一个类的所有方法和属性(包括继承的方法和属性)放在一个页面上比查看其类型层次结构要好得多。
.. autoclass:: Noodle
   :members:
   :inherited-members: