Snabbtips Vad är en metaklass i Python?

Denna snabba tips ger en kort översikt över vad vi menar med en metaklass i Python och visar några exempel på konceptet.

Innan jag går in i den här artikeln ska jag påpeka en viktig punkt om klasser i Python som gör det lättare för oss att förstå begreppet metaklass.

Är en klass ett objekt i Python?!

Om du har använt ett annat programmeringsspråk än Python, är det troligt att konceptet du förstod om klasser är ett sätt att skapa nya objekt. Detta är också sant i Python, men Python tar det ännu ett steg längre-klasser anses också vara föremål!

Så, om du skapade följande klass i Python:

klass myClass (objekt): passera

Detta innebär helt enkelt att en objekt med namnet min klass har skapats i minnet. Eftersom det här objektet kan skapa nya objekt betraktas det som a klass. Det betyder att vi kan tillämpa objektoperationer på klasser i Python, eftersom klasserna är föremål själva.

Vi kan således göra aktiviteter på klasser som att tilldela klassen till en variabel enligt följande:

class_object = myClass () print class_object

Vilken avkastning:

<__main__.myClass object at 0x102623610>

Du kan även passera klassen min klass som en parameter till en metod, enligt följande:

def class_object (object): skriva objekt class_object (myClass)

Vilket returnerar följande utmatning:

Förutom andra operationer kan du normalt ansöka om föremål.

Metaclasses

Kanske har du stött på typ sökord i python? Du brukar använda den för att kontrollera typen av något objekt, som visas i följande exempel:

utskriftstyp ('abder') utskriftstyp (100) utskriftstyp (100,0) utskriftstyp (int)

I så fall skulle du få följande utdata:

   

Titta på produktionen, allt verkar ganska klart tills du kommer till typen typ. För att se vad detta kan betyda, låt oss gå tillbaka till vår klass som vi definierade i början av den här artikeln:

klass myClass (objekt): passera

Gör nu följande:

utskriftstyp (myClass)

Vad skulle vara resultatet av detta uttalande? Det kommer överraskande att vara:

Så vi kan dra slutsatsen att typen av klasser i Python är typ!

Vad är förhållandet mellan a typ och a metaklass? Jo, a typ är en metaklass, förutsatt att standardvärdet metaklass är typ. Jag vet att det kan vara förvirrande, särskilt det typ kan användas för att returnera klassen av något objekt som visas ovan, men detta beror på bakåtkompatibiliteten i Python. Så, om du skriver:

utskriftstyp (typ)

Du kommer att få:

Det betyder att a typ är en typ!

Termen metaklass betyder helt enkelt någonting brukade skapa klasser. Med andra ord är det klassen av en klass, vilket innebär att förekomsten av en klass i detta fall är en klass. Således, typ anses vara a metaklass sedan förekomsten av a typ är en klass.

Till exempel när vi nämnde följande uttalande ovan:

class_object = myClass ()

Detta bygger helt enkelt ett objekt / förekomst av klassen min klass. Med andra ord använde vi en klass för att skapa ett objekt. 

På samma sätt när vi gjorde följande:

klass myClass (objekt): passera

De metaklass användes för att skapa klassen min klass (som anses vara a typ). Så, som objektet är en förekomst av en klass, är en klass en förekomst av a metaklass.

Använda Metaclass för att skapa en klass

I det här avsnittet ska vi se hur vi kan använda en metaklass att skapa en klass, snarare än att använda klass uttalande som vi såg i klasserna och objektet handledning. Som vi såg ovan, standard metaklass är typ. Således kan vi använda följande uttalande för att skapa en ny klass:

new_class = typ ('myClass', (), ) 

Om du vill göra saker enklare kan du tilldela samma klassnamn min klass till variabelnamnet.

Ordboken här används för att definiera klassens attributter. Så, med följande uttalande:

myClass = typ ('myClass', (), 'a': True)

Liknar:

klass myClass (objekt): a = True

Den __metaclass__ Attribut

Säg att vi skapade klassen min klass som följer:

klass myClass (objekt): __metaclass__ = myMetaClass pass

I det här fallet kommer klassbildning att ske med myMetaClass istället för typ, som följer:

myClass = myMetaClass (klassnamn, baser, ordbok)

Skapande och initialisering av en metaklass

Om du vill ha kontroll över hur du skapa och initialisera en klass efter skapandet, kan du helt enkelt använda metaklassen __ny__ metod och __i det__ konstruktor. Så när myMetaClass ovan heter, det här är vad som kommer att hända bakom kulisserna:

myClass = myMetaClass .__ ny __ (myMetaClass, namn, baser, ordbok) myMetaClass .__ init __ (myClass, namn, baser, ordbok)

Jag vill inte göra det här snabba tipset längre, men för att sammanfatta kan vi dra slutsatsen att a metaklass används i Python för att skapa en klass. Det är förekomsten av a metaklass är en klass. Om du vill dyka djupare in i metaklass kan du kolla in den här handledningen.