2013-03-13 18 views
94

Ho scoperto che entrambi i seguenti lavori:Tutte le classi Python dovrebbero estendere l'oggetto?

class Foo(): 
    def a(self): 
     print "hello" 

class Foo(object): 
    def a(self): 
     print "hello" 

caso tutte le classi Python estendere oggetto? Ci sono potenziali problemi con l'estensione dell'oggetto?

+1

Is c'è una differenza tra 'classe Foo():' e 'classe Foo:'? Come osservo, entrambi funzionano in Python 3. – Wolf

risposta

87

In Python 2, non eredita da object creerà una classe di vecchio stile, che, tra gli altri effetti, fa sì che type per dare risultati diversi:

>>> class Foo: pass 
... 
>>> type(Foo()) 
<type 'instance'> 

vs.

>>> class Bar(object): pass 
... 
>>> type(Bar()) 
<class '__main__.Bar'> 

anche le regole per l'ereditarietà multipla sono different in modi che non cercherò nemmeno di riassumere qui. Tutta la buona documentazione che ho visto su MI descrive classi di nuovo stile.

Infine, le classi vecchio stile sono scomparse in Python 3 e l'ereditarietà da object è diventata implicita. Quindi, preferisci sempre le nuove classi di stile a meno che non ti serva una compatibilità con i vecchi software.

2

Sì, tutte le classi Python devono estendere (o piuttosto sottoclasse, questo è Python qui) oggetto. Mentre normalmente non si verificheranno problemi seri, in alcuni casi (come nel caso di più alberi ereditari) questo sarà importante. Ciò garantisce anche una migliore compatibilità con Python 3.

+1

esattamente, tecnicamente se non si otterrà una classe classica, ma non ci sono vantaggi reali a questo e non è supportato comunque da python 3 –

+0

Sono curioso di sapere perché migliora la compatibilità con python3. A mio parere, python3 farà estendere automaticamente l'oggetto anche se non lo specifichi, giusto? –

+2

@PaulLo Esatto, ma se si eredita esplicitamente dall'oggetto, si otterrà lo stesso comportamento (di nuovo stile) sia su Python 2 che su Python 3. Non si tratta di cambiare il modo in cui funziona Python 3, si tratta di utilizzare forward-compatibility su Python 2. – pydsigner

42

In Python 3, le classi si estendono in modo implicito object, indipendentemente dal fatto che lo si dica o meno.

In Python 2, sono presenti le classi old-style and new-style. Per segnalare che una classe è di nuovo stile, è necessario ereditare esplicitamente da object. In caso contrario, viene utilizzata l'implementazione vecchio stile.

Generalmente si desidera una classe di nuovo stile. Eredita da object in modo esplicito.

+0

Sì, la differenza [Free Foo indicata] (https://stackoverflow.com/a/15374901/2932052), è andata, BTW: [le parentesi vuote sono facoltative?] (Https://stackoverflow.com/questions/15374857/should-all-python-classes-extend-object # comment66528880_15374857) – Wolf

+2

C'è molto codice Python 3 che usa foo (oggetto) :. E 'solo una convenzione allora? – RFVenter

+2

@RFVenter Potrebbe trattarsi di codice che deve essere eseguito con Python 2 e 3, nel qual caso è necessario sottoclasse esplicitamente l'oggetto per far sì che la classe si comportino in gran parte con Python 2. – blubberdiblub

0

in python3 non c'è una differenza, ma in python2 non si estende object fornisce classi di vecchio stile; ti piacerebbe usare una classe di nuovo stile su una classe vecchio stile.

+1

Questa risposta è ragionevole, ma altri rispondenti sono arrivati ​​più velocemente e/o con maggiori dettagli; questa risposta non aggiunge alcun valore alla pagina così com'è. –

11

In python 3 è possibile creare una classe in tre modi diversi: & internamente sono tutti uguali (vedere esempi). Non importa come si crea una classe, tutte le classi in Python 3 ereditano dalla classe speciale chiamata oggetto. La classe oggetto è classe fondamentale in pitone e fornisce molte funzionalità come metodo a doppia sottolineatura metodi, descrittori, super(), metodo di proprietà() ecc

Esempio 1.

class MyClass: 
pass 

Esempio 2 .

class MyClass(): 
pass 

Esempio 3.

class MyClass(object): 
    pass 
+1

Questo non è strettamente vero ... https://stackoverflow.com/questions/1238606/is-it-necessi-or-usea-tutto-integrazione-da-pythons-object-in-python-3-x/45893772 # 45893772 –

+0

Non sono sicuro di seguirti. E sì, probabilmente non è rilevante per la maggior parte delle persone fino a quando non è rilevante. –

Problemi correlati