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

あなたT2C2クラス自体に含まれているので、それhelpを検出して正しい情報を表示します。

于 2012-03-09T12:04:16.950 に答える
1

最初の方法では、各オブジェクトCのインスタンス属性になります。T

2番目の方法Cでは、クラスのクラス属性になりますT

help(T)クラスに関するヘルプを提供しますT(名前が参照するオブジェクト、Tこの場合はクラスです)。すべてのインスタンスに当てはまる場合でも、の特定のインスタンスについては何も知ることができませんT(とにかく、そうではない可能性があります。後のコードで可能ですmy_T = T(); del my_T.C)。

于 2012-03-09T12:06:51.800 に答える
0

表示した2つのスニペットは同等ではありません。

これ:

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 に答える