1

オブジェクトインスタンスとオブジェクト継承インスタンスの違いがわかりません。

1。、、__dict__-このプロパティはどこから__module____weakref__

>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> dir(type('tt',(object,),{}))
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

2.オブジェクトインスタンスにプロパティを設定できません。

>>> b= object()
>>> b.f = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'f'
>>> b = type('tt',(object,),{})()
>>> b.f = 4

この違いは組み込みのタイプビルダーに由来しますか?なんで?

4

2 に答える 2

1

まず第一に、いくつかのタイプは不変です。たとえば、不変であり、プレーンintインスタンスも不変です。同じ制限はサブクラスには適用されません。サブクラス化して可変属性を与えることができます。同じことが。にも当てはまります。tupleobjectintobject

この属性は、クラスビルダー( )__dict__によってカスタムクラスに追加されます。type()これは、クラスの名前空間マッピングです。クラスの属性ルックアップは、その構造のキールックアップに変換されます。object一方、Python Cタイプであり、Cの属性とメソッドは異なる方法で処理されます。Python Cタイプは、代わりにCタイプインターフェイスを実装することが期待されています。一部の型.__dict__は逆参照できますが、カスタム型のようにC型を動的に変更できないため、代わりに読み取り専用のプロキシオブジェクトであることがわかります。

__module__属性はとで利用可能です:objectint

>>> object.__module__
'builtins'
>>> int.__module__
'builtins'

ただし、これらは組み込み型であるため、属性は実際にはほとんど意味がなく、にリストされていませんdir()

__weakref__属性は、weakrefモジュールの実装の詳細です。クラスに属性__dict__が設定されていない場合、コンストラクターは属性とともにtype()この属性をカスタムクラスに設定します。属性と同様に、カスタムクラスとCタイプオブジェクトの間に別の違いがあります。Python Cタイプの場合、 Cタイプのオブジェクト構造のさまざまなエントリが同じ役割を果たします。__slots____dict__

于 2013-03-22T11:16:19.700 に答える
1

1.1。

__dict__は、各pythonオブジェクトが持つ、変数を格納する辞書です。foo.xルックアップします(スペースを節約するために代わりにfoo.__dict__['x']使用するクラスもあります)__slots__

__module__クラスのモジュールを指します。

>>> object.__module__
'__builtin__' # object is part of the builtin module

__weakref__weakrefはオブジェクトへの参照です。これは、参照カウントガベージコレクションシステムに影響を与えることなく、オブジェクトへの参照を保持するためにモジュールによって使用されます。用途についてはこちらをご覧ください。

2.2。

object()インスタンスには、がないため、プロパティを設定できません__dict__

>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

他のすべてのクラスの基本クラスとしてのみ使用され、1つは必要ありません。

実際に使用typeすると、のサブクラスが作成されますobject。また、その属性にa{}を指定したので、もちろんb.f = 4機能します。

于 2013-03-22T10:22:59.657 に答える