2016-05-14 37 views
1

Wie kommt es, dass eine Metaklasse nicht im MRO angezeigt wird?Reihenfolge der Methodenauflösung und Metaklassen

Zum Beispiel:

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

Auch sah ich an anderer Stelle, dass Python C3 Linearisierung verwendet die MRO zu berechnen, aber das Linearisierungs nicht behandelt metaclasses. Welchen Algorithmus benutzt Python dann?

+1

Haben Sie versucht, es auf einer Instanz von Bar aufzurufen? Weil es dann nicht funktioniert. Und AFAIK-Metaklassen und Mehrfachvererbung werden nicht unterstützt. Ich weiß jedoch nicht, wie ich zu Foo kommen soll. – deets

Antwort

4

Da keiner Ihrer Klassen aus der Metaklasse ableiten. Eine Metaklasse ist keine Basisklasse. Die Metaklasse ist die Factory, die das Klassenobjekt produziert, genau wie ein Klassenobjekt Instanzen erzeugt.

Hier ist keine Linearisierung erforderlich. Bar ist ein Objekt vom Typ Foo, genauso wie andere Klassen vom Typ type sind. Alle Unterklassen von Bar haben den gleichen Typ (die Metaklasse); sie haben diese Beziehung direkt. Eine Klasse kann nur eine Metaklasse gleichzeitig haben.

Eine Metaklasse kommt zuletzt beim Nachschlagen von Attributen; so Bar.spam wird zuerst in der MRO gesucht werden, und nur dann auf type(Bar).

Natürlich verwenden Metaklassen auch eine Vererbungshierarchie; Foo wurde in Ihrem Beispiel von type abgeleitet. Diese Beziehung verwendet auch ein MRO.

+0

Danke. Was ist mit meiner zweiten Frage? –

+0

@ValentinLorentz: Ich denke, das ist schon beantwortet? –

+0

Sorry, ich habe gleich nach dem Posten des Kommentars verstanden. Auch dein Edit beantwortet es ebenfalls. –