2010-04-26 9 views
13

Sto usando Python da un po 'di tempo ormai, e non sono ancora sicuro del motivo per cui dovresti sottoclasse da object. Qual è la differenza tra questo:Perché sarebbe necessario eseguire la sottoclasse dall'oggetto in Python?

class MyClass(): 
    pass 

E questo:

class MyClass(object): 
    pass 

Per quanto ho capito, object è la classe base per tutte le classi e sottoclassi è implicito. Ottieni qualcosa dalla sua sottoclassi esplicita? Qual è la cosa più "Pythonic" da fare?

risposta

12

Questo è oldstyle e nuove classi di stile in python 2.x. Il secondo modulo è la versione aggiornata ed esiste da Python 2.2 e versioni successive. Per il nuovo codice dovresti usare solo le nuove classi di stile.

In Python 3.x è possibile utilizzare nuovamente entrambe le forme in modo indifferente poiché il nuovo stile è l'unico rimasto e entrambe le forme sono veramente equivalenti. Tuttavia, ritengo che dovresti continuare a utilizzare il modulo MyClass(object) anche per il codice 3.x almeno fino a quando python 3.x è ampiamente adottato per evitare qualsiasi malinteso con i potenziali lettori del tuo codice utilizzato per 2.x.

Il comportamento tra il vecchio stile e le nuove classi di stile è molto diverso rispetto a certe funzionalità come l'uso di super().

vedere qui: New Style classes

è anche possibile vedere here su SO.

+1

Non valido per 3.X –

+0

@Noctis - cosa non è valido per 3.x? Il vecchio stile? La differenza tra vecchio/nuovo? – phkahler

+0

Ereditare da 'Object' è il comportamento predefinito per Python 3.x –

7

concordato con @kriss, @Noctis e @Carson. più colore da me:

class X: pass e class X(): pass sono sinonimi di classi classiche mentre class X(object): pass è per classi di nuovo stile, come potete vedere qui:

>>> class X:pass 
... 
>>> class Y(): pass 
... 
>>> class Z(object): pass 
... 
>>> 
>>> type(X), type(Y), type(Z) 
(<type 'classobj'>, <type 'classobj'>, <type 'type'>) 

sguardo al linky fornito da @kriss per maggiori dettagli sulle differenze. ciò che non è valido in Python 3 è il concetto della classe classica ... la ragione è perché le classi classiche sono state deprecate. tutti e tre gli idiomi creano solo classi di nuovo stile in qualsiasi 3.x:

>>> class X:pass 
... 
>>> class Y(): pass 
... 
>>> class Z(object): pass 
... 
>>> 
>>> type(X), type(Y), type(Z) 
(<class 'type'>, <class 'type'>, <class 'type'>) 

cosa significa bottom-line? se stai codificando in Python 2, prova ad usare il più possibile le classi di nuovo stile. in questo modo, hai già creato il tuo percorso di migrazione. inoltre le lezioni di stile nuovo offrono più funzionalità rispetto alle classi classiche. (questo è un po 'soggettivo, ma se le tue classi [classiche] sono relativamente semplici, allora è possibile che tu non debba fare nulla per farle funzionare in Python 3.)

+1

+1 buon esempio. –

Problemi correlati