Sfat rapid Ce este o Metaclass în Python?

Acest sfat rapid oferă o scurtă prezentare a ceea ce înțelegem printr-o metaclașă în Python și prezintă câteva exemple ale conceptului.

Înainte de a intra în acest articol, ar trebui să subliniez un punct important despre clasele din Python, care ne ușurează să înțelegem conceptul de metaclase.

Este o clasă un obiect în Python?!

Dacă ați folosit un limbaj de programare diferit de Python, conceptul pe care l-ați înțeles despre clase este cel mai probabil că este o modalitate folosită pentru a crea noi obiecte. Acest lucru este valabil și în cazul Python, dar Python o ia chiar cu încă un pas. Clasele suplimentare sunt, de asemenea, considerate obiecte!

Deci, dacă ați creat următoarea clasă în Python:

clasa myClass (obiect): pass

Acest lucru înseamnă pur și simplu că o obiect cu denumirea clasa mea a fost creat în memorie. Deoarece acest obiect este capabil să creeze obiecte noi, este considerat a clasă. Aceasta înseamnă că putem aplica operații obiect pe clase în Python, deoarece clasele sunt ele însele.

Astfel, putem face operațiuni pe clase ca atribuirea clasei unei variabile, după cum urmează:

class_object = myClass () print class_object

Care se întoarce:

<__main__.myClass object at 0x102623610>

Puteți trece chiar și clasa clasa mea ca parametru pentru o metodă, după cum urmează:

def class_object (obiect): obiect de imprimare class_object (myClass)

Care returnează următoarea ieșire:

În plus față de alte operații, puteți aplica în mod obișnuit pe obiecte.

Metaclasses

Poate că v-ați întâlnit tip cuvânt cheie în Python? Cel mai probabil ați folosit-o pentru a verifica tipul de obiect, după cum se arată în următoarele exemple:

tipul de tipărire (tip "abder") tip de imprimare (100) tip de imprimare (100.0) tipul de tipărire (int)

În acest caz, veți obține următoarele rezultate:

   

Privind la ieșire, totul pare destul de clar până când ajungeți la tip tip. Pentru a vedea ce ar putea însemna asta, să ne întoarcem la clasa pe care am definit-o la începutul acestui articol:

clasa myClass (obiect): pass

Faceți următoarele:

tip de imprimare (myClass)

Care ar fi rezultatul acestei afirmații? Va fi surprinzător:

Deci, putem concluziona că tipul de clase din Python este tip!

Care este relația dintre a tip și a metaclass? Ei bine, a tip este a metaclass, cu condiția ca aceasta să nu fie stabilită metaclass este tip. Știu că ar putea fi confuz, mai ales asta tip poate fi folosit pentru a returna clasa unui obiect așa cum este arătat mai sus, dar acest lucru se datorează compatibilității înapoi în Python. Deci, dacă scrieți:

tip de tipărire (tip)

Vei primi:

Înțeles că a tip este a tip!

Termenul metaclass înseamnă pur și simplu ceva folosit pentru a crea clase. Cu alte cuvinte, este clasa unei clase, ceea ce înseamnă că instanța unei clase în acest caz este o clasă. Prin urmare, tip este considerat a metaclass de la caz la caz tip este o clasă.

De exemplu, când am menționat următoarea afirmație:

class_object = myClass ()

Aceasta construiește pur și simplu un obiect / instanță a clasei clasa mea. Cu alte cuvinte, am folosit o clasă pentru a crea un obiect. 

În același mod, când am făcut următoarele:

clasa myClass (obiect): pass

 metaclass a fost folosit pentru a crea clasa clasa mea (care este considerat a tip). Deci, ca obiectul fiind o instanță a unei clase, o clasă este o instanță a unui metaclass.

Folosind Metaclass pentru a crea o clasă

În această secțiune, vom vedea cum putem folosi a metaclass pentru a crea o clasă, mai degrabă decât să utilizați clasă așa cum am văzut în tutorialul de clase și obiecte. După cum am văzut mai sus, implicit metaclass este tip. Astfel, putem folosi următoarea afirmație pentru a crea o nouă clasă:

new_class = type ('myClass', (), ) 

Dacă doriți să simplificați lucrurile, puteți atribui același nume de clasă clasa mea la numele variabilei.

Dictionarul aici este folosit pentru a defini atributele clasei. Deci, având următoarea afirmație:

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

Este similar cu:

clasa myClass (obiect): a = Adevărat

Atributul __metaclass__

Spuneți că am creat clasa clasa mea după cum urmează:

clasa myClass (obiect): __metaclass__ = pass meaMetaClass

În acest caz, crearea de clasă va apărea utilizând myMetaClass in loc de tip, după cum urmează:

myClass = myMetaClass (nume de clasă, baze, dicționar)

Crearea și inițierea unei metaclase

Dacă vrei să ai controlul asupra modului în care tu crea și inițializa o clasă după crearea ei, puteți pur și simplu utiliza metaclase __nou__ și __init__ constructor, respectiv. Deci când myMetaClass de mai sus este numit, acesta este ceea ce se va întâmpla în spatele scenei:

myClass = myMetaClass .__ new __ (myMetaClass, nume, baze, dicționar) myMetaClass .__ init __ (myClass, nume, baze, dicționar)

Nu vreau să fac acest sfat rapid, dar pentru a rezuma, putem concluziona că a metaclass este folosit în Python pentru a crea o clasă. Asta este, de exemplu, a metaclass este o clasă. Dacă doriți să vă grăbiți mai adânc în metaclase, puteți consulta acest tutorial.

Cod