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