2009-08-06 14 views
48

En la versión más antigua de python cuando se crea una clase en python, puede heredar de objeto que es lo más lejos que entiendo un elemento python incorporado especial que permite que su objeto sea un objeto de estilo nuevo.¿Es necesario o útil heredar del objeto Python en Python 3.x?

¿Qué hay de la versión más nueva (> 3.0 y 2.6)? Busqué en Google el objeto de la clase pero obtuve tanto resultado (por razones obvias). ¿Alguna pista?

¡Gracias!

+2

Si su código también se usará en 2.x, es bueno ser explícito. – smci

Respuesta

39

No necesita heredar de object para tener un nuevo estilo en python 3. Todas las clases son de estilo nuevo.

+0

Gracias :) Miré a través del libro en línea (Un byte de Pyhton) y una gran cantidad de documentos de Pyhton, pero nunca encontré mi respuesta claramente ... – thomas

+0

¿Qué hay de Python 2.6? – luc

+3

python 2.6 se comporta como python 2.x – SilentGhost

22

Me doy cuenta de que esta es una vieja pregunta, pero vale la pena señalar que incluso en Python 3 estas dos cosas no son exactamente lo mismo.

Si hereda explícitamente de object, lo que realmente está haciendo es heredar de builtins.objectindependientemente de lo que señale en ese momento.

Por lo tanto, podría tener algún módulo (muy raro) que anule el objeto por alguna razón. Vamos a llamar a este primer módulo "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 

Luego, en algún otro archivo ("klasses.py"):

class Greeter(object): 
    pass 

class NonGreeter: 
    pass 

Luego, en un tercer archivo (que puede en realidad la prueba):

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 

Así se puede ver que, en el caso en que se hereda de forma explícita desde el objeto, se obtiene un comportamiento diferente de donde se permite la herencia implícita.

+4

¡Voto ascendente para la locura! Pensamientos increíbles! –

Cuestiones relacionadas