¿Es necesario o útil heredar del objeto de Python en Python 3.x?

94

En la versión anterior de Python, cuando crea una clase en Python, puede heredar de un objeto que, según entiendo, es un elemento especial de Python incorporado que permite que su objeto sea un objeto de nuevo estilo.

¿Qué pasa con la versión más reciente (> 3.0 y 2.6)? Busqué en Google sobre el objeto de clase, pero obtengo muchos resultados (por razones obvias). ¿Alguna pista?

¡Gracias!

Thomas
fuente
2
Si su código también se utilizará en 2.x, es bueno ser explícito.
smci
1
Está bien respondido en esta pregunta: stackoverflow.com/questions/4015417/…
nngeek

Respuestas:

94

No es necesario heredar de objectpara tener un nuevo estilo en Python 3. Todas las clases son de nuevo estilo.

SilentGhost
fuente
5
Tenga en cuenta que esto significa que todas las clases heredan objectindependientemente de si se escribe explícitamente (object)o no en Python 3.1
u0b34a0f6ae
8
No es necesario, pero el "Portando el código de Python a Python 3" dice que todavía es válido: docs.python.org/py3k/howto/pyporting.html#subclass-object También: docs.python.org/reference/ …
hiperbóreo
De esta publicación mencionada en el comentario de nngeek, parece que una buena referencia estable para el estilo antiguo frente al estilo nuevo (solo realmente relevante para Py2) es: docs.python.org/2/reference/… - los enlaces anteriores parecían tener desde que cambió.
Eric Cousineau
80

Me doy cuenta de que esta es una pregunta antigua, 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 en realidad está haciendo es heredar de builtins.object independientemente de lo que eso apunte en ese momento.

Por lo tanto, podría tener algún módulo (muy loco) que anule el objeto por alguna razón. Llamaremos 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 otro archivo ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Luego, en un tercer archivo (que realmente podemos ejecutar):

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

Entonces, puede ver que, en el caso de que herede explícitamente de un objeto, obtenemos un comportamiento diferente al que permite la herencia implícita.

Philip Adler
fuente
14
Es relevante porque, en general, la expectativa es que el comportamiento sea equivalente. No es equivalente, de ahí mis observaciones.
Philip Adler