Python non ha (o ha bisogno) "classi parametrizzate", quindi è difficile fornire esempi in Python ;-). Un metaclasse è semplicemente "la classe di una classe": normalmente type
(quanto tempo, in Py2, come ti ricordi di rendere la classe nuovo stile ereditando da object
, o qualche altro tipo built-in o altra classe di nuovo stile - - Le classi vecchio stile sono un artefatto esistente in Py2, fortunatamente scomparso in Py3, e dovresti idealmente dimenticarti di loro). Puoi creare un metaclasse personalizzato (di solito sottoclasse type
) per diversi scopi avanzati, ma è improbabile che tu abbia sempre necessario (specialmente considerando che, dal momento che Python 2.6, gran parte di ciò che richiedeva un metaclass personalizzato ora può essere fatto più semplicemente con un decoratore di classe).
Data qualsiasi classe C, type(C)
è il suo metaclasse.
Una classe parametrizzata è un concetto completamente diverso. Più vicino si può venire ad esso in Python è probabilmente una funzione di fabbrica che rende e restituisce una classe basata sui suoi argomenti:
def silly(n):
class Silly(object):
buh = ' '.join(n * ['hello'])
return Silly
Silly1 = silly(1)
Silly2 = silly(2)
a = Silly1()
print(a.buh)
b = Silly2()
print(b.buh)
stamperà
hello
hello hello
Anche in questo caso, è sicuramente non qualcosa che si' Avremo bisogno di molte cose, rendendo diverse classi che differiscono solo da uno o pochi argomenti. Ad ogni modo, come potete vedere, non ha assolutamente nulla a che fare con la classe delle classi (metaclasse AKA), che è sempre type
in questo esempio (e in quasi tutti gli esempi più realistici a cui potrei pensare - ho appena scelto di dare un semplice esempio, dove è difficile distinguere il punto in cui farlo, piuttosto che uno realistico e quindi necessariamente molto complesso ;-).
fonte
2010-08-16 18:48:17
Sono passato a Py3 un paio di giorni fa, pensando che visto che sono solo uno studente in questo momento, dovrei imparare la "novità nuova di domani". Indovina che è stata una mossa intelligente :-) – yrsnkd
+1. Buona spiegazione –
+1 Ottima spiegazione come sempre. – katrielalex