2009-08-06 17 views
48

Nella versione python precedente quando si crea una classe in python, può ereditare dall'oggetto , che per quanto ne so è uno speciale elemento python incorporato che consente al proprio oggetto di essere un oggetto di nuovo stile.È necessario o utile ereditare dall'oggetto Python in Python 3.x?

E la versione più recente (> 3.0 e 2.6)? Ho cercato su Google l'oggetto di classe, ma ottengo così tanto risultato (per ovvi motivi). Qualche suggerimento?

Grazie!

+2

Se il codice verrà utilizzato anche in 2.x, è opportuno essere espliciti. – smci

risposta

39

Non è necessario ereditare da object di avere un nuovo stile in python 3. Tutte le classi sono in stile nuovo.

+0

Grazie :) Ho controllato il libro online (un byte di Pyhton) e un sacco di documenti di Pyhton ma non ho mai trovato la mia risposta in modo chiaro ... – thomas

+0

Che ne dici di Python 2.6? – luc

+3

python 2.6 si comporta come python 2.x – SilentGhost

22

Mi rendo conto che questa è una vecchia domanda, ma vale la pena notare che anche in Python 3 queste due cose non sono esattamente la stessa cosa.

Se si eredita esplicitamente da object, ciò che si sta effettivamente facendo eredita da builtins.objectindipendentemente da ciò a cui punta in quel momento.

Pertanto, potrei avere un modulo (molto stravagante) che sovrascrive l'oggetto per qualche motivo. Chiameremo questo primo modulo "newobj.py":

import builtins 

old_object = builtins.object # otherwise cyclic dependencies 

class new_object(old_object): 

    def __init__(self, *args, **kwargs): 
     super(new_object, self).__init__(*args, **kwargs) 
     self.greeting = "Hello World!" 

builtins.object = new_object #overrides the default object 

Poi in qualche altro file ("klasses.py"):

class Greeter(object): 
    pass 

class NonGreeter: 
    pass 

Poi, in un terzo file (che si può effettivamente gestita):

import newobj, klasses # This order matters! 

greeter = klasses.Greeter() 
print(greeter.greeting) # prints the greeting in the new __init__ 

non_greeter = klasses.NonGreeter() 
print(non_greeter.greeting) # throws an attribute error 

Così si può vedere che, nel caso in cui è esplicitamente che eredita da oggetto, si ottiene un comportamento diverso da quello in cui si consente l'eredità implicita.

+4

Upvote for crazy! Pensieri fantastici! –

Problemi correlati