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

È stato utile?

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/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top