Tutto in Python è un oggetto, incluse le classi.
Questo significa che puoi fare riferimento a classi, passarle come argomenti, memorizzarle in attributi, nomi (extra), elenchi, dizionari, ecc.
Questo è perfettamente normale in Python:
class_map = {
'foo': A,
'bar': SomeOtherClass,
'baz': YetAnother,
}
instance = class_map[some_variable]()
Ora dipende da some_variable
quale classe è stata scelta per creare un'istanza; i valori del dizionario class_map
sono tutte le classi.
Le classi sono esse stesse istanze del loro tipo ; questo è chiamato il loro metaclass . Puoi produrre una nuova classe chiamando type()
con un nome, una sequenza di classi base e un mapping che definisce gli attributi della classe:
type('DynamicClass', (), {'foo': 'bar'})
crea un nuovo oggetto di classe, con un attributo foo
impostato su bar
, ad esempio. La classe prodotta può sé quindi essere utilizzata per creare istanze. Quindi le classi sono prodotte da metaclassi, così come le istanze sono prodotte dalle classi.
Puoi produrre i tuoi metaclassi ereditando da type
, aprendo un mondo strano e meraviglioso di comportamento di classe.
Chiamare un metodo non associato passando in un'istanza separata non è davvero un buon esempio dell'uso delle classi come oggetto. Tutto ciò che hai fatto è stato utilizzare il riferimento iniziale (il nome della classe) per cercare il metodo, quindi passare un'istanza della classe come primo parametro da sostituire per self
.