なぜクラス__dict__
は なのにmappingproxy
インスタンス__dict__
は単なるdict
>>> class A:
... pass
>>> a = A()
>>> type(a.__dict__)
<class 'dict'>
>>> type(A.__dict__)
<class 'mappingproxy'>
ベストアンサー1
これにより、インタープリターは、クラス レベルの属性とメソッドのキーが文字列のみであることを保証できます。
Python は「同意する大人の言語」であり、オブジェクトの辞書は公開され、ユーザーによって変更可能です。ただし、クラスのクラス レベルの属性とメソッドの場合、キーが文字列であることを保証できれば、クラス レベルでの属性とメソッドの検索の一般的なケース コードを簡素化して高速化できます。特に、新しいスタイルのクラスの __mro__ 検索ロジックは、クラス辞書のキーが文字列であると想定することで簡素化され、高速化されます。