1

Python 2.7.12のドキュメントによると、3.4.2.3。 Descriptors¶を呼び出す:インスタンス属性の検索でメタクラスの属性が検索されないのはなぜですか?

属性アクセスのデフォルトの動作は、取得セット、または オブジェクトの辞書から属性を削除することです。例えば、a.xtype(a).__dict__['x'] 、その後、a.__dict__['x']で始まる 参照チェーンを持っており、メタクラス除く type(a)の基底クラスを介して継続します。

しかし、なぜメタクラスは除外されていますか?

を連続して呼び出す場合は、selfがインスタンスオブジェクトまたはタイプオブジェクトの場合は、最終的には<type 'type'>になります。だから私はメタクラスがこの "特権"を楽しむ理由を理解できません。インスタンスオブジェクトの場合は、object.__getattribute__が使用されているので、私は参照チェーンは次のようになりますだと思う:ところで


は、私はこの引用によって少し混乱している

  • a.__dict__['x']
  • 012用type(a).__mro__
  • type(b).__dict__[x]type(a).__dict__['x']bため
  • b.__dict__[x]
  • type(b).__mro__
  • cためtype(a).__mro__
  • c.__dict__[x]で......

は、私は右ですか?属性検索はすべて拠点type(a)type(a).__mro__)のではなく、すべてのタイプtype(a)type(type(a)))のを検索するため

+0

私はあなたがメタクラスと属性アクセスを試しているのを見ています。あなたがPython 3を使っていない理由は何ですか?ほとんどすべてのプロジェクトでPython 3を使うことができますが、Python2には組み込まれていない多くの機能や変更点があります。 – jsbueno

+0

@jsbueno Hmm ...互換性については、私の大学(私のクラスメート、実際には一緒にプロジェクトに取り組んでいます)は、多くのモジュールがまだPython3をサポートしていないので、Python2を最初に学ぶことを勧めました。私の実験は、Pythonがバックグラウンドでどのように機能するかを理解するためのもので、いつかPython3に切り替えることができれば役に立ちます。 –

+0

「多くのモジュールにはまだPython 3のサポートがありません」とは、2015年以降は真実ではないと思います。 Python3の中で最も重要なことは、あなたが探している深い理解のために、私はPython3がはるかに関連性があると言うでしょう。 Pythonの2行目の終わりは2020年に予定されています。今日プロジェクトを開始した場合、それは移行する3年前です。それは価値があるとは言いません。 – jsbueno

答えて

1

です。 @jsbuenoが賢明指摘したように

  • a.__dict__['x']
  • type(a).__dict__['x']
  • b.__dict__[x] for b in type(a).__mro__
  • raise AttributeError

:参照チェーンは次のようになりますので、

また、type(self)は、継続的に呼び出されませんコメントの中で、2番目のst epは実際には第3のものに含まれています。これは、どのクラスでも、クラスCC自体がC.__mro__の最初の項目であるとします。

+0

実際には、2番目のステップが3番目に含まれています。何が起きるのかを理解するために、 'type(a).__ dict __ ['x']'タイプが(b)__ dict __ [x] ' – jsbueno

+0

@jsbuenoはい、あなたは正しいです。 'C'クラス自体は、' C .__ mro__'の最初の項目です。回答が編集されました。 –

関連する問題