Deze snelle tip geeft een kort overzicht van wat we bedoelen met een metaklasse in Python en toont enkele voorbeelden van het concept.
Voordat ik inga op dit artikel, moet ik wijzen op een belangrijk punt over lessen in Python, waardoor we gemakkelijker het concept van metaclasses kunnen begrijpen..
Als je een andere programmeertaal dan Python hebt gebruikt, is het concept dat je hebt begrepen over klassen hoogstwaarschijnlijk een manier om nieuwe objecten te maken. Dit is ook waar in Python, maar Python gaat zelfs nog een stap verder - klassen worden ook als objecten beschouwd!
Dus, als je de volgende les in Python hebt gemaakt:
class myClass (object): geslaagd
Dit betekent eenvoudig dat een voorwerp met de naam mijn klas
is gemaakt in het geheugen. Omdat dit object nieuwe objecten kan maken, wordt het beschouwd als een klasse. Dit betekent dat we objectbewerkingen kunnen toepassen op klassen in Python, omdat klassen zelf objecten zijn.
We kunnen dus bewerkingen uitvoeren op klassen zoals het toewijzen van de klasse aan een variabele, als volgt:
class_object = myClass () print class_object
Wat terugkomt:
<__main__.myClass object at 0x102623610>
Je kunt zelfs de klas passeren mijn klas
als een parameter voor een methode, als volgt:
def class_object (object): print object class_object (myClass)
Die de volgende uitvoer retourneert:
Naast andere bewerkingen die u normaal gesproken kunt toepassen op objecten.
Misschien bent u de type
trefwoord in Python? U hebt het waarschijnlijk gebruikt om het type van een object te controleren, zoals in de volgende voorbeelden:
print type ('abder') print type (100) print type (100.0) print type (int)
In dat geval krijgt u de volgende uitvoer:
Als je naar de uitvoer kijkt, lijkt alles vrij duidelijk tot je bij het type komt type
. Om te zien wat dit zou kunnen betekenen, gaan we terug naar onze les die we aan het begin van dit artikel hebben gedefinieerd:
class myClass (object): geslaagd
Doe nu het volgende:
print type (myClass)
Wat zou de output van deze verklaring zijn? Het zal verrassend zijn:
Dus, we kunnen concluderen dat het type klassen in Python is type
!
Wat is de relatie tussen een type
en een metaclass
? Welnu, a type
is een metaclass
, op voorwaarde dat de standaard metaclass
is type
. Ik weet dat dit misschien verwarrend is, vooral dat type
kan worden gebruikt om de klasse van een object te retourneren zoals hierboven weergegeven, maar dit komt door de compatibiliteit met eerdere versies in Python. Dus, als je schrijft:
afdruktype (type)
Je zult krijgen:
Dat betekent dat een type
is een type
!
De voorwaarde metaclass
eenvoudig betekent iets dat is gebruikt om klassen te maken. Met andere woorden, het is de klasse van een klasse, wat betekent dat de instantie van een klasse in dit geval een klasse is. Dus, type
wordt als een beschouwd metaclass
sinds de instantie van a type
is een klasse.
Toen we bijvoorbeeld de volgende verklaring hierboven noemden:
class_object = myClass ()
Dit bouwt eenvoudigweg een object / instantie van de klasse mijn klas
. Met andere woorden, we gebruikten een klasse om een object te maken.
Op dezelfde manier, toen we het volgende deden:
class myClass (object): geslaagd
De metaclass
werd gebruikt om de klasse te maken mijn klas
(die wordt beschouwd als een type
). Dus, net zoals het object een instantie van een klasse is, is een klasse een instantie van een metaclass
.
In deze sectie gaan we kijken hoe we een kunnen gebruiken metaclass
om een klasse te maken in plaats van de klasse
verklaring zoals we zagen in de tutorial over klassen en objecten. Zoals we hierboven zagen, is de standaard metaclass
is type
. Daarom kunnen we de volgende verklaring gebruiken om een nieuwe klasse te maken:
new_class = type ('myClass', (), )
Als u dingen eenvoudiger wilt maken, kunt u dezelfde klassenaam toewijzen mijn klas
naar de naam van de variabele.
Het woordenboek hier wordt gebruikt om de attributen van de klasse te definiëren. Dus, met de volgende verklaring:
myClass = type ('myClass', (), 'a': True)
Is gelijkaardig aan:
class myClass (object): a = True
Zeg dat we de klas hebben gemaakt mijn klas
als volgt:
class myClass (object): __metaclass__ = myMetaClass-pass
In dit geval vindt het maken van klassen plaats met behulp van myMetaClass
in plaats van type
, als volgt:
myClass = myMetaClass (className, bases, woordenboek)
Als je controle wilt hebben over hoe jij creëren en initialiseren een klasse na zijn creatie, je kunt eenvoudig de metaclass gebruiken __nieuwe__
methode en __in het__
constructeur. Dus wanneer myMetaClass
hierboven wordt genoemd, dit is wat er achter de schermen gebeurt:
myClass = myMetaClass .__ nieuw __ (myMetaClass, naam, bases, woordenboek) myMetaClass .__ init __ (myClass, naam, bases, woordenboek)
Ik wil deze snelle tip niet langer maken, maar om samen te vatten, kunnen we concluderen dat een metaclass
wordt gebruikt in Python om een klasse te maken. Dat wil zeggen, de instantie van a metaclass
is een klasse. Als je dieper in metaclasses wilt duiken, kun je deze tutorial bekijken.