我正在用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的信息。
有人可以了解这里发生的事情吗?感谢。
答案 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'>