子类中的Python Docstrings

时间:2012-03-09 11:52:40

标签: python class nested docstring

我正在用Python创建一个类,然后使用setattr()添加一些嵌套类。

class T( object ):
    def __init__( self ):
        cDict = {}
        cDict['__doc__'] = 'Inner class doc string'
        setattr( self, 'C', type('C', (), cDict ) )

但是,调用help(T)然后不包含和有关C的信息。构造T,然后在其中的C,工作正常。

这样做传统方式很好:

class T2( object ): 
    class C2( object ):
        __doc__ = 'Inner class doc string'

呼叫帮助(T2)显示有关C2的信息。

有人可以了解这里发生的事情吗?感谢。

3 个答案:

答案 0 :(得分:2)

help对类和类型进行操作,而不是对象。但是,您的T只有对象中的成员C(运行__init__时)。因此help无法检测到它。

您的T2在类中也包含C2,因此help会检测到它并显示正确的信息。

答案 1 :(得分:1)

第一种方法使C成为每个T对象的实例属性。

第二种方式使C成为T类的类属性。

help(T)提供T类的帮助(嗯,名称T引用的对象,在本例中是一个类)。它对T的任何给定实例都不知道任何事情,即使它对每个实例都是正确的(无论如何它可能都不是;后来的代码可以my_T = T(); del my_T.C)。

答案 2 :(得分:0)

您展示的两个片段不相同。

此:

class T( object ):
    def __init__( self ):
        cDict = {}
        cDict['__doc__'] = 'Inner class doc string'
        setattr( self, 'C', type('C', (), cDict ) )

将在每个C实例上设置T属性:

>>> T.C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'T' has no attribute 'C'
>>> t = T()
>>> t.C
<class '__main__.C'>

这是因为您将setattr放在__init__内。

虽然这个:

class T2( object ): 
    class C2( object ):
        __doc__ = 'Inner class doc string'

将在T2本身添加一个属性:

>>> T2.C2
<class '__main__.C2'>