tipo di classe in Python
-
28-09-2019 - |
Domanda
perché se lo faccio:
class C(): pass
type(C())
ho ottenuto: <type 'instance'>
, ma se lo faccio:
class C(object): pass
type(c())
ho ottenuto:? <class '__main__.c'>
Il primo non è molto userfull
Soluzione
Guardate la differenza tra le classi in stile vecchio e nuovo stile. I primi sono il default, e questi ultimi ereditano in modo esplicito da oggetto.
Tutti gli oggetti in stile antico sono state attuate con il built-in istanza del tipo. Il fatto che sono ancora il difetto ed il loro tipo rimane 'esempio' è il risultato di precauzioni retro-compatibilità.
Questo viene estratto dalla documentazione Python (http://docs.python.org/reference/datamodel.html)
3.3. New-style e classico classi Classi e istanze sono disponibili in due sapori: vecchio stile (o classico) e new-style.
Fino a Python 2.1, classi vecchio stile erano l'unico sapore a disposizione del utente. Il concetto di (vecchio stile) di classe è correlato al concetto di tipo: se x è un'istanza di un vecchio stile di classe, allora X. class indica la classe di x, ma il tipo (x) è sempre . Ciò riflette la fatto che tutte le istanze vecchio stile, indipendentemente dalla loro classe, sono implementato con un unico integrato tipo, chiamato esempio.
classi New-style sono stati introdotti nel Python 2.2 per unificare le classi e tipi. Una classe di nuovo stile non è né più né meno di un tipo definito dall'utente. Se x è un'istanza di una classe di nuovo stile, quindi tipo (x) è tipicamente uguale x>. class (anche se questo non è garantito - un classe di nuovo stile istanza è permesso di ignorare il valore restituito per x. class ).
La motivazione principale per l'introduzione classi di nuovo stile è quello di fornire un modello a oggetti unificato con un pieno meta-modello. Essa ha anche un certo numero di vantaggi pratici, come la possibilità sottoclasse più tipi built-in, o l'introduzione di “descrittori”, che consentono proprietà calcolate.
Per motivi di compatibilità, le classi sono ancora vecchio stile per impostazione predefinita. Nuovo stile classi sono create specificando un'altra classe di nuovo stile (vale a dire un tipo) come una classe genitore, o il “top-level digitare”oggetto se nessun altro genitore è necessario. Il comportamento di new-style classi differisce da quella di vecchio stile classi in un certo numero di importanti dati in aggiunta a quanto tipo () ritorna. Alcuni di questi cambiamenti sono fondamentale per il nuovo modello a oggetti, come il modo in cui sono metodi speciali invocato. Altri sono “correzioni” che potrebbero Non essere attuate prima per problemi di compatibilità, come la ordine di risoluzione metodo in caso di ereditarietà multipla.
Mentre questa finalità manuale per fornire copertura completa di Python meccanica classe, può ancora essere carente in alcune zone quando si tratta di la sua copertura di classi di nuovo stile. Perfavore guarda http://www.python.org/doc/newstyle/ per le fonti di informazioni aggiuntive.
classi Vecchio stile vengono rimossi in Python 3.0, lasciando solo la semantica di new-style classes.of classi di nuovo stile.
Altri suggerimenti
Onestamente, non credo che una risposta breve è in ordine qui. Vi consiglio di iniziare a leggere su classi di tipo unificazione / new-style di Python qui: http://www.python.org/doc/newstyle/