2014-06-17 6 views
5

Sto leggendo un libro Python e si parla sempre di "dato X il suo tipo è Y", quindi mi sto confondendo.C'è qualche differenza tra tipo e classe?

C'è qualche differenza tra chiedere il tipo di un oggetto e la classe di di appartenenza di un oggetto in python2 e python3?

Voglio dire, sono tipo e classe due concetti diversi?

Questa domanda deriva dal fatto che nei pitoni precedenti al 2.1 c'era una differenza tra chiamare x.__class__ e type(x).

risposta

4

Prima di Python 2.2, lo era una differenza tra "[classiche] classi" e "[built-in] tipi".

Fondamentalmente, non è stato possibile creare sottoclassi di tipi incorporati e hanno avuto un comportamento idiosincratico che li ha resi diversi dalle classi definite dall'utente.

This blog post dal creatore di Python Guido van Rossum spiega alcune delle motivazioni per l'unificazione di classi definite dall'utente e tipi built-in nell'ambito di "classi di nuovo stile".

Anche il wiki Python ha un buon background su the practical differences between the classic and new-style user-defined classes.

tl; dr: In Python 2.7 è ancora possibile creare una "classe classica", per compatibilità con le versioni precedenti, ma i tipi predefiniti si comportano come classi di nuovo stile.

+0

quindi prima di Python 2.2, eveything, in qualche modo, era un'istanza di un tipo built-in, voglio dire anche che una classe era un'istanza del tipo built-in ' istanza', la ** classe ** era solo un'etichetta per differenziare a quale particolare istanza di una classe un oggetto appartiene. È giusto? – zer0uno

+0

Fondamentalmente corretto: le classi classiche definite dall'utente, quando istanziate, producevano oggetti con il tipo generico 'instance', con alcuni attributi e metodi specifici della classe su di esso. Penso che il post del blog di GvR, a cui mi sono collegato, ne dia una visione più approfondita. Se segui le lezioni di stile nuovo, non dovrai mai pensare a queste cose nel moderno Python. –

2

No, il tipo e la classe indicano lo stesso.

Anche se i tipi built-in e l'estensione C (estensione dell'interprete, come le classi Java in Jython) possono essere trattati in modo leggermente diverso, ad esempio potresti non essere in grado di eseguire il patch-patch. Nelle vecchie versioni di CPython c'era anche un problema con i builtin di sottoclassi, ma è stato così tanto tempo fa che ne ho solo letto e non ho visto "in azione".

Inoltre, c'è differenza con le classi vecchio stile e nuovo in Python2, ma non è molto importante in questo contesto.

Alla fine ci sono molti "tipi di tipi", ma i nomi "classe" e "tipo" sono equivalenti. Ancora - "type" è usato più spesso per i builtin, mentre la classe - non così spesso. Con non-builtins entrambi i nomi sono frequenti.

+0

Questo non è vero nelle versioni precedenti di Python; vedere la mia risposta sopra. Probabilmente @antox sta leggendo un libro o una documentazione scritta per una versione precedente di Python, che potrebbe essere fonte di confusione. –

+2

Prima ho fornito una risposta breve, poi ho modificato il post e l'ho migliorato. Sembra che abbiamo postato entro un minuto circa) –