Два показанных вами фрагмента не эквивалентны.
This:
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'>