10

カスタムタイプのインスタンスに対して新しい属性を作成できる理由(「新しい」は「クラス本体で以前に定義されていない」ことを意味します)が、ビルドに対して同じことを行うことができない理由を知りたいです-タイプで、objectそれ自体のように。

コード例:

>>> class SomeClass(object):
...     pass
... 
>>> sc = SomeClass()
>>> sc.name = "AAA"
>>> sc.name
'AAA'
>>> obj = object()
>>> obj.name = "BBB"
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'object' object has no attribute 'name'
4

1 に答える 1

6

一部のオブジェクトには、__ dict__属性(すべてのカスタムの「新しく定義された」属性を格納するディクショナリ)がありません。__slots__変数を使用して同じ動作をエミュレートできます(Pythonリファレンスを参照)。__dict__でクラスをサブクラス化する場合、__slots__変数は効果がありません。また、常に新しいスタイルクラスのオブジェクトをサブクラス化しているため、オブジェクトに__dict__を含めることはできません。これにより、__slots__を使用できなくなります。__slots__のないクラスは、メモリの消費量が少なく、おそらくわずかに高速です。

于 2010-07-30T19:13:49.360 に答える