¿Cuál es el propósito de subclasificar la clase "objeto" en Python?
-
24-09-2019 - |
Pregunta
Todas las funciones integradas de Python son subclases de object
y me encuentro con muchas clases definidas por el usuario que también lo son.¿Por qué?¿Cuál es el propósito de la clase? object
?Es sólo una clase vacía, ¿verdad?
Solución
En resumen, libera ponis mágicos.
Durante mucho tiempo, Python 2.2 y versiones anteriores utilizaron "clases de estilo antiguo".Eran una implementación particular de clases y tenían algunas limitaciones (por ejemplo, no se podían subclasificar tipos integrados).La solución para esto fue crear un nuevo estilo de clase.Pero hacer esto implicaría algunos cambios incompatibles con versiones anteriores.Entonces, para asegurarse de que el código escrito para clases de estilo antiguo aún funcione, el object
La clase se creó para actuar como una superclase para todas las clases de nuevo estilo.Entonces, en Python 2.X, class Foo: pass
creará una clase de estilo antiguo y class Foo(object): pass
creará una nueva clase de estilo.
En más detalle, ver Guido Unificando tipos y clases en Python 2.2.
Y, en general, es una buena idea adquirir el hábito de hacer todas tus clases con un estilo nuevo, porque algunas cosas (el @property
decorador es uno que me viene a la mente) no funcionará con clases de estilo antiguo.
Otros consejos
Respuesta corta: object
la subclasificación efectivamente hace que un nuevo estilo clase (nota que esto es innecesario, ya automática en Python 3.x)
Para la diferencia entre las clases y las clases new style
old style
: ver este stackoverflow cuestionar . Para la historia completa: ver este bonito valoración crítica sobre los tipos de Python y objetos
Tiene que ver con el "nuevo estilo" de clases. Puede leer más sobre esto aquí: http://docs.python.org/ tutorial / classes.html # múltiple herencia y también aquí: http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
Utilización de las clases de nuevo estilo le permitirá utilizar "de Python más reciente, versátil características como __slots__, descriptores, propiedades y __getattribute __ ()."
derecho, pero marca la clase como un href="http://www.python.org/doc/newstyle/" rel="nofollow noreferrer"> clase nuevo estilo
La versión corta es que las clases clásicas, que no necesitan una superclase, tenían limitaciones que no podía ser trabajado en todo sin romper un montón de código antiguo. Así que crearon el concepto de clases de nuevo estilo que subclase de object
, y ahora se pueden hacer cosas interesantes como definir las propiedades, y la subclasificación dict
ya no es un ejercicio de dolor y extraños insectos.
Los detalles están en la sección 3.3 de la documentación de Python: Nuevo- estilo y clases clásicos.
Python 2.2 introdujo "nuevas clases de estilo" que tenía una serie de características adicionales relativas a las viejas clases de estilo, que no lo hicieron objeto de subclase. Las subclases objeto fue la forma elegida para indicar que su clase debe ser una nueva clase de estilo, no un estilo antiguo.