Ich versuche, meinen Kopf um Metaklasse zu bekommen, aber ich kann immer noch nicht wirklich das Konzept davon bekommen.Understanding Metaklassen in Python
Soviel ich weiß:
Jede Klasse ist selbst eine Instanz vom Typ „Typ“ - also „Berufung“ eine Klasse ruft einfach die Methode __call__
auf seiner Klasse - die Art des __call__
sein geschieht. Die Wirkung von type.__call__
ist genau das: auf Code wie:
Klasse A: Pass b = A()
Die Reihenfolge der Schritte, ich weiß hier:
1. type.__call__
die Klasse A empfängt selbst als sein erster Parameter.
- Es ruft die
A.__new__
- im Pseudocode könnten wir schreibeninstance = A.__new__(cls)
als was läuft.
3.That gibt eine Instanz der Klasse "A"
4.Then es nennt __init__
auf der Instanz (instance.__init__()
) ... und gibt diese Instanz Instanz
zurückkehren Aber jetzt Sehen Sie den Code unten:
class MetaOne(type):
def __new__(meta, classname, supers, classdict):
print('In MetaOne.new:', meta, classname, supers, classdict, sep='\n...')
return type.__new__(meta, classname, supers, classdict)
class Eggs:
pass
print('making class')
class Spam(Eggs, metaclass=MetaOne):
data = 1
def meth(self, arg):
return self.data + arg
print('making instance')
X = Spam()
print('data:', X.data, X.meth(2))
die Ausgabe von diesem Skript wird wie folgt:
Somaking class
In MetaOne.new:
...<class '__main__.MetaOne'>
...Spam
...(<class '__main__.Eggs'>,)
...{'__qualname__': 'Spam', '__module__': '__main__', 'meth': <function Spam.met
h at 0x00000000010C1D08>, 'data': 1}
making instance
data: 1 3
nach meinem Verständnis ist dies die Folge von Schritten:
Da Spam ist eine Instanz MetaOne,
X = Spam()
Aufruf würde versuchen, die__call__
Methode der MetaOne Klasse zu nennen, die nicht da ist.Da MetaOne vom Typ erbt, würde es die
__call__
Methode des Typs class mitSpam
als das erste Argument aufrufen.
Danach wird der Anruf landet in der __new__
Methode der MetaOne Klasse, aber es sollte Spam
als erster param enthalten.
Woher kommt meta
Argument der MetaOne-Klasse ins Bild kommen.
Bitte helfen Sie mir in meinem Verständnis.