Snelle tip wat is een metaclass in Python?

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..

Is een klasse een object in Python?!

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.

metaclasses

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.

Metaclass gebruiken om een ​​klasse te maken

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

Het kenmerk __metaclass__

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)

Creatie en initialisatie van een Metaclass

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.