2013-05-12 16 views
7

我々はdir()ビルトインオブジェクトスーパークラスにし、「ダミー」、bodylessクラスには、そのようなクラスはデフォルトの '__dict__'属性をどこから取得しますか?

class A(): 
    pass 

として、私たちは、クラスが持っていることを見つける3つの属性('__dict__', '__module__' and '__weakref__')を適用することにより、生成されたリストを比較するとオブジェクトクラスには存在しません。

ここで、Aクラスはこれらの追加属性を継承しますか?

+0

「オブジェクト」の親からです。 –

答えて

8
  • __dict__属性はtype.__new__に内部コードによって作成されます。クラスのメタクラスは、__dict__の最終的な内容に影響する場合があります。 __slots__を使用している場合、__dict__属性はありません。

  • __module__は、クラスのコンパイル時に設定されるため、インスタンスはクラスからこの属性を継承します。テストinst.__module__ is cls.__module__(がのインスタンスであることを前提とします)を実行し、cls.__module__を変更し、inst.__module__にこの変更が反映されていることを確認することで、これを確認できます。

    (あなたもcls.__module__異なる値にinst.__module__を設定するような愚かなことを行うことができないのはなぜこれが読み取り専用属性ではありません確認してください。。)インスタンスがあるとき

  • __weakref__が作成されます。 AFAIKは内部CPythonオブジェクト作成システムによって完全に制御されます。この属性は、objectサブクラスのインスタンスにのみ存在します。たとえば、intlistsettupleには、__weakref__属性がありません。

    class C:は、Python3の場合はclass C(object):に相当します。 Python2の場合、class C:は、__weakref__(またはobjectの実装から取得された多数の他の属性)のないインスタンスを生成します。

+1

'__dict__'は' type .__ new__'によって設定されます。メタクラスの '__prepare__'メソッドによって返された値は、メタクラスの' __new__'メソッドに渡されます(新しいクラスが実際に作成された場合、ほとんどの場合最終的に 'type .__ new__'に渡されます)。そして 'type .__ new__'はあなたが実際のdict以外のものを与えると文句を言う。したがって、 '__prepare__'が返すものは実際の' __dict__'属性に何の影響もなく、最終的に '__dict__'に追加される* contents *を蓄積するために使われます。 Python2は同じですが、累積コレクションを選択することはできません。 – Ben

+0

@Ben:ありがとう、私はこれを明確にした – kampu

+2

"この説明を解釈する際、' class C: 'は' class C(object): ''と同等であることを覚えておいてください - Py3ではなく '' Py3 ' – glglgl

関連する問題