0

我在 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'

调用 help( T2 ) 显示有关 C2 的信息。

有人可以解释这里发生了什么吗?谢谢。

4

3 回答 3

2

help作用于类和类型,而不是对象。但是,您T只有C对象中的成员(何时__init__运行)。所以help检测不出来。

T2还包含C2在类本身中,因此help可以检测到它并显示正确的信息。

于 2012-03-09T12:04:16.950 回答
1

第一种方式导致C成为每个T对象的实例属性。

第二种方式导致C成为类的类属性T

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

于 2012-03-09T12:06:51.800 回答
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'>
于 2012-03-09T12:06:00.693 回答