Metaclasse
# Metaclasse

In programmazione a oggetti, una metaclasse è una classe le cui istanze sono a loro volta classi. Questo concetto è strettamente legato al concetto di riflessione (reflection), che si applica a quegli strumenti concettuali che permettono di rappresentare, all'interno di un programma, informazioni sulle parti costituenti del programma stesso (tipicamente classi e oggetti).

Il concetto di metaclasse è impiegato soprattutto a livello teorico (appare, per esempio, nella definizione formale della semantica dello Unified Modeling Language), ma trova anche applicazioni dirette in diversi linguaggi di programmazione. In Java, per esempio, tutte le classi sono concettualmente considerate istanze dell'unica metaclasse Class, in Python type è una metaclasse.

## Python

In Python una metaclasse è per lo più definita come una sottoclasse di type.

Questa metaclasse sovrascrive solamente la creazione dell'oggetto. Tutti gli altri aspetti della classe e comportamento dell'oggetto sono ancora gestiti da type. Ora la classe Car può essere riscritta per usare questa metaclasse. In Python 2 si fa assegnando __metaclass__ nella definizione di classe mentre in Python 3 fornendo all'argomento della classe metaclass = M)

Gli oggetti Car si possono istanziare così:

Un altro esempio di Metaclasse in Python:

## Linguaggi che supportano le metaclassi

* Common Lisp, attraverso CLOS
* Delphi e altre versioni di Object Pascal influenzate da esso
* Groovy
* Objective-C
* Python
* Perl, attraverso la metaclasse pragma, come anche utilizzando Moose
* Ruby
* Smalltalk
