¿Por qué las clases de Python heredan objetos?
¿ Por qué hereda la siguiente declaración de clase object
?
class MyClass(object):
...
¿ Hay alguna razón para heredar una declaración de clase
object
?
En Python 3, aparte de la compatibilidad entre Python 2 y 3, no hay motivo . En Python 2, hay muchas razones .
Historia de Python 2.x:
En Python 2.x (desde 2.2 en adelante) hay dos estilos de clases dependiendo de la presencia o ausencia de object
una clase base:
Clases de estilo "clásico" : no tienen
object
como clase base:>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
Clases de estilo "nuevas" : tienen, directa o indirectamente (por ejemplo, heredadas de un tipo incorporado ),
object
como clase base:>>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,)
Sin duda, al escribir una clase siempre querrás optar por clases de nuevo estilo. Las ventajas de hacerlo son numerosas, por enumerar algunas de ellas:
Soporte para descriptores . Específicamente, las siguientes construcciones son posibles con descriptores:
classmethod
: método que recibe la clase como argumento implícito en lugar de la instancia.staticmethod
: método que no recibe el argumento implícitoself
como primer argumento.- propiedades con
property
: crea funciones para gestionar la obtención, configuración y eliminación de un atributo. __slots__
: Ahorra consumo de memoria de una clase y también da como resultado un acceso a atributos más rápido. Por supuesto, impone limitaciones .
El
__new__
método estático: le permite personalizar cómo se crean nuevas instancias de clase.Orden de resolución de métodos (MRO) : en qué orden se buscarán las clases base de una clase al intentar resolver a qué método llamar.
Relacionado con MRO,
super
llamadas . Ver también,super()
considerado súper.
Si no heredas de object
, olvídate de estos. Puede encontrar una descripción más exhaustiva de los puntos anteriores junto con otras ventajas de las "nuevas" clases de estilo aquí .
Una de las desventajas de las clases de nuevo estilo es que la clase en sí requiere más memoria. Sin embargo, a menos que estés creando muchos objetos de clase, dudo que esto sea un problema y es algo negativo que se hunde en un mar de aspectos positivos.
Historia de Python 3.x:
En Python 3, las cosas se simplifican. Sólo existen clases de nuevo estilo (a las que se hace referencia simplemente como clases), por lo que la única diferencia al agregar object
es que requiere que escriba 8 caracteres más. Este:
class ClassicSpam:
pass
es completamente equivalente (aparte de su nombre :-) a esto:
class NewSpam(object):
pass
y a esto:
class Spam():
pass
Todos tienen object
en su __bases__
.
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
¿Entonces, qué debería hacer?
En Python 2: heredar siempre de object
explícitamente . Obtenga las ventajas.
En Python 3: hereda de object
si estás escribiendo código que intenta ser independiente de Python, es decir, debe funcionar tanto en Python 2 como en Python 3. De lo contrario, no lo hagas, realmente no hay diferencia ya que Python lo inserta por ti. entre bastidores.
Pitón 3
class MyClass(object):
= Clase de nuevo estiloclass MyClass:
= Clase de nuevo estilo (hereda implícitamente deobject
)
Pitón 2
class MyClass(object):
= Clase de nuevo estiloclass MyClass:
= CLASE AL ANTIGUO ESTILO
Explicación :
Al definir clases base en Python 3.x, puede eliminarlas object
de la definición. Sin embargo, esto puede abrir la puerta a un problema muy difícil de rastrear...
Python introdujo clases de nuevo estilo en Python 2.2, y ahora las clases de estilo antiguo son bastante antiguas. La discusión sobre las clases de estilo antiguo está oculta en los documentos 2.x y no existe en los documentos 3.x.
El problema es que la sintaxis de las clases de estilo antiguo en Python 2.x es la misma que la sintaxis alternativa para las clases de estilo nuevo en Python 3.x. Python 2.x todavía se usa ampliamente (p. ej., GAE, Web2Py), y cualquier código (o codificador) que, sin saberlo, introduzca definiciones de clases de estilo 3.x en código 2.x terminará con algunos objetos base seriamente obsoletos. Y como las clases al viejo estilo no están en el radar de nadie, es probable que no sepan qué les pasó.
Así que explíquelo detalladamente y ahorre las lágrimas a algún desarrollador 2.x.
Sí, este es un objeto de "nuevo estilo". Fue una característica introducida en python2.2.
Los objetos de nuevo estilo tienen un modelo de objeto diferente al de los objetos clásicos, y algunas cosas no funcionarán correctamente con objetos de estilo antiguo, por ejemplo, super()
y @property
descriptores. Consulte este artículo para obtener una buena descripción de qué es una nueva clase de estilo.
Enlace SO para una descripción de las diferencias: ¿ Cuál es la diferencia entre las clases de estilo antiguo y nuevo en Python?