2016-05-14 1 views
1

どのようにしてメタクラスがMROに表示されないのですか?例えばメソッドの分解順序とメタクラス

>>> class Foo(type): 
... foo = 21 
... 
>>> class Bar(metaclass=Foo): 
... pass 
... 
>>> Bar.mro() 
[<class '__main__.Bar'>, <class 'object'>] 
>>> Bar.foo 
21 

はまた、私はPythonがMROを計算するためにC3の線形化を使用していることを他の場所で見ましたが、この線形化はメタクラスを処理しません。その場合、Pythonはどんなアルゴリズムを使用しますか?

+1

Barのインスタンスで呼び出そうとしましたか?それ以来、それは動作しません。 AFAIKメタクラスと多重継承はサポートされていません。しかし、私は今Fooに行く方法を失っています。 – deets

答えて

4

のクラスがメタクラスからを派生していないため、メタクラスはで、基底クラスではありませんです。メタクラスは、Barクラスオブジェクトを生成し、クラスオブジェクトのようにインスタンスを生成するファクトリです。

ここには線形化は必要ありません。 BarはタイプFooのオブジェクトで、他のクラスはタイプtypeです。 Barのサブクラスはすべて同じ型(メタクラス)を持ちます。それらの関係はであり、直接です。あるクラスは、一度にの1つだけを持つことができます。

属性を検索するときにメタクラスが最後に表示されます。したがって、Bar.spamはMROで最初に検索され、、次にtype(Bar)にのみ表示されます。

もちろん、メタクラスも継承階層を使用します。 Fooは、あなたの例ではtypeから派生しました。その関係もMROを使用しています。

+0

ありがとうございます。私の2番目の質問はどうですか? –

+0

@ValentinLorentz:それはすでに答えられていると思いますか? –

+0

申し訳ありませんが、私はコメントを投稿した直後に理解しました。また、あなたの編集もそれに答える。 –