Questo suggerimento fornisce una breve panoramica di ciò che intendiamo per metaclasse in Python e mostra alcuni esempi del concetto.
Prima di approfondire questo articolo, dovrei sottolineare un punto importante sulle classi in Python che ci rende più facile cogliere il concetto di metaclassi.
Se hai usato un linguaggio di programmazione diverso da Python, il concetto che hai capito sulle classi è molto probabile che sia un modo usato per creare nuovi oggetti. Questo è vero anche in Python, ma Python lo prende ancora un passo in più: anche le classi sono considerate oggetti!
Quindi, se hai creato la seguente classe in Python:
class myClass (oggetto): pass
Ciò significa semplicemente che a oggetto con il nome la mia classe
è stato creato in memoria. Poiché questo oggetto è in grado di creare nuovi oggetti, è considerato a classe. Ciò significa che possiamo applicare le operazioni sugli oggetti sulle classi in Python, poiché le classi sono oggetti stessi.
Possiamo quindi fare operazioni su classi come assegnare la classe a una variabile, come segue:
class_object = myClass () stampa class_object
Che restituisce:
<__main__.myClass object at 0x102623610>
Puoi anche passare la lezione la mia classe
come parametro per un metodo, come segue:
def class_object (oggetto): print object class_object (myClass)
Che restituisce il seguente risultato:
In aggiunta ad altre operazioni normalmente puoi applicare sugli oggetti.
Forse hai incontrato il genere
parola chiave in Python? Molto probabilmente lo hai usato per verificare il tipo di alcuni oggetti, come mostrato nei seguenti esempi:
tipo di stampa ('abder') tipo di stampa (100) tipo di stampa (100.0) tipo di stampa (int)
Nel qual caso otterresti il seguente risultato:
Guardando l'output, tutto sembra abbastanza chiaro finché non si arriva al tipo genere
. Per vedere cosa potrebbe significare, torniamo alla nostra classe che abbiamo definito all'inizio di questo articolo:
class myClass (oggetto): pass
Ora, fai quanto segue:
tipo di stampa (myClass)
Quale sarebbe l'output di questa affermazione? Sorprendentemente sarà:
Quindi, possiamo concludere che il tipo di classi in Python è genere
!
Qual è la relazione tra a genere
e a metaclasse
? Bene, a genere
è un metaclasse
, a condizione che il valore predefinito metaclasse
è genere
. So che questo potrebbe essere fonte di confusione, specialmente quello genere
può essere usato per restituire la classe di alcuni oggetti come mostrato sopra, ma ciò è dovuto alla compatibilità con le versioni precedenti in Python. Quindi, se scrivi:
tipo di stampa (tipo)
Otterrete:
Significa che a genere
è un genere
!
Il termine metaclasse
significa semplicemente qualcosa usato per creare classi. In altre parole, è la classe di una classe, il che significa che l'istanza di una classe in questo caso è una classe. così, genere
è considerato un metaclasse
dall'istanza di a genere
è una classe.
Ad esempio, quando abbiamo menzionato la seguente dichiarazione sopra:
class_object = myClass ()
Questo semplicemente crea un oggetto / istanza della classe la mia classe
. In altre parole, abbiamo usato una classe per creare un oggetto.
Allo stesso modo, quando abbiamo fatto quanto segue:
class myClass (oggetto): pass
Il metaclasse
è stato usato per creare la classe la mia classe
(che è considerato un genere
). Quindi, come se l'oggetto fosse un'istanza di una classe, una classe è un'istanza di a metaclasse
.
In questa sezione, vedremo come possiamo usare a metaclasse
creare una classe, piuttosto che usare il classe
dichiarazione come abbiamo visto nel tutorial di classi e oggetti. Come abbiamo visto sopra, il default metaclasse
è genere
. Quindi, possiamo usare la seguente dichiarazione per creare una nuova classe:
new_class = type ('myClass', (), )
Se vuoi semplificare le cose, puoi assegnare lo stesso nome di classe la mia classe
al nome della variabile.
Il dizionario qui viene usato per definire gli attributi della classe. Quindi, avendo la seguente dichiarazione:
myClass = type ('myClass', (), 'a': True)
È simile a:
class myClass (oggetto): a = True
Dì che abbiamo creato la classe la mia classe
come segue:
class myClass (oggetto): __metaclass__ = myMetaClass pass
In questo caso, si verificherà la creazione della classe utilizzando myMetaClass
invece di genere
, come segue:
myClass = myMetaClass (className, basi, dizionario)
Se vuoi avere il controllo su come tu creare e inizializzare una classe dopo la sua creazione, puoi semplicemente usare la metaclasse __nuovo__
metodo e __dentro__
costruttore, rispettivamente. Cosi quando myMetaClass
sopra si chiama, questo è ciò che accadrà dietro le quinte:
myClass = myMetaClass .__ new __ (myMetaClass, nome, basi, dizionario) myMetaClass .__ init __ (myClass, nome, basi, dizionario)
Non voglio rendere questo suggerimento più veloce, ma per riassumere, possiamo concludere che a metaclasse
è usato in Python per creare una classe. Cioè, l'istanza di a metaclasse
è una classe. Se vuoi approfondire le metaclassi, puoi dare un'occhiata a questo tutorial.