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