Python 2.7.12のドキュメントによると、3.4.2.3。 Descriptors¶を呼び出す:インスタンス属性の検索でメタクラスの属性が検索されないのはなぜですか?
は属性アクセスのデフォルトの動作は、取得セット、または オブジェクトの辞書から属性を削除することです。例えば、
a.x
はtype(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]
- で
c
ためtype(a).__mro__
c.__dict__[x]
で......
type(b).__mro__
は、私は右ですか?属性検索はすべて拠点type(a)
(type(a).__mro__
)のではなく、すべてのタイプtype(a)
(type(type(a))
)のを検索するため
私はあなたがメタクラスと属性アクセスを試しているのを見ています。あなたがPython 3を使っていない理由は何ですか?ほとんどすべてのプロジェクトでPython 3を使うことができますが、Python2には組み込まれていない多くの機能や変更点があります。 – jsbueno
@jsbueno Hmm ...互換性については、私の大学(私のクラスメート、実際には一緒にプロジェクトに取り組んでいます)は、多くのモジュールがまだPython3をサポートしていないので、Python2を最初に学ぶことを勧めました。私の実験は、Pythonがバックグラウンドでどのように機能するかを理解するためのもので、いつかPython3に切り替えることができれば役に立ちます。 –
「多くのモジュールにはまだPython 3のサポートがありません」とは、2015年以降は真実ではないと思います。 Python3の中で最も重要なことは、あなたが探している深い理解のために、私はPython3がはるかに関連性があると言うでしょう。 Pythonの2行目の終わりは2020年に予定されています。今日プロジェクトを開始した場合、それは移行する3年前です。それは価値があるとは言いません。 – jsbueno