2010-08-16 6 views
6

contributori Ciao Stack Overflow,Qual è la differenza tra una classe parametrizzata e una metaclasse (esempi di codice in Python per favore)?

Sono un programmatore alle prime armi di apprendimento Python in questo momento, e mi è venuto su this site che aiuta a spiegare paradigmi orientati agli oggetti. So che i metaclassi sono classi di classi (come il modo in cui le meta-directory sono directory di directory, ecc. Ecc.), Ma ho problemi con qualcosa: qual è la differenza effettiva tra una metaclasse e una classe parametrizzata, secondo la definizione del sito Web?

Se possibile, si prega di includere esempi di codice in Python che illustrano le differenze tra i due. Grazie per l'aiuto!

risposta

14

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

+0

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

+0

+1. Buona spiegazione –

+0

+1 Ottima spiegazione come sempre. – katrielalex

0

Questo write up può essere di aiuto. E this one è un vecchio, ma vale la pena anche leggere. So che questo non risponde completamente alla tua domanda, ma spero che ti dia spunti di riflessione.

Problemi correlati