Todos los complementos 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 solo una clase vacía, ¿verdad?¿Cuál es el propósito de subclasificar la clase "objeto" en Python?
Respuesta
En resumen, establece ponies mágicos gratis.
En versión larga, Python 2.2 y versiones anteriores usaban "clases de estilo anterior". Eran una implementación particular de clases, y tenían algunas limitaciones (por ejemplo, no se podían subclasificar tipos incorporados). La solución para esto fue crear un nuevo estilo de clase. Pero hacer esto implicaría algunos cambios incompatibles hacia atrás. Por lo tanto, para asegurarse de que el código escrito para clases de estilo antiguo aún funcione, la clase object
se creó para actuar como una superclase para todas las clases de estilo nuevo. Por lo tanto, 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 una versión más larga, consulte el número Unifying types and classes in Python 2.2 de Guido.
Y, en general, es una buena idea para entrar en el hábito de hacer todas las clases de nuevo estilo, porque algunas cosas (la @property
decorador es uno que viene a la mente) no funcionará con las clases de estilo antiguo .
Correcto, pero marca la clase como una clase new-style. Las clases recientemente desarrolladas deben usar la base object
porque cuesta poco y a prueba de futuro su código.
Tiene que ver con el "nuevo estilo" de las clases. Puede leer más sobre esto aquí: http://docs.python.org/tutorial/classes.html#multiple-inheritance 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 "más nuevos y versátiles características de Python como __slots__, descriptores, propiedades y __getattribute __()".
La versión corta es que las clases clásicas, que no necesitaban una superclase, tenían limitaciones que no se podían solucionar sin romper muchos códigos antiguos. Así que crearon el concepto de clases de nuevo estilo que subclase de object
, y ahora puedes hacer cosas geniales como definir propiedades, y la subclase dict
ya no es un ejercicio de dolor y errores extraños.
Los detalles están en la sección 3.3 de la documentación de Python: New-style and classic classes.
Python 2.2 introduced "new style classes" que tenía una serie de características adicionales relativas a las viejas clases de estilo, que no lo hicieron objeto de subclase. El objeto de las subclases fue la forma elegida para indicar que su clase debería ser una nueva clase de estilo, no una de estilo antiguo.
Respuesta corta: la subclasificación object
efectivamente hace que sea una clasede nuevo estilo (tenga en cuenta que esto es innecesario, ya automática en Python 3.x)
Por la diferencia entre clases y new style
old style
clases: véase this stackoverflow question. Para la historia completa: vea this nice writeup on Python Types and Objects.
- 1. ¿Cuál es el propósito de la clase NullObject en Groovy?
- 2. ¿Cuál es el propósito de la clase TestExecution en MSTest?
- 3. Problema subclasificar BaseException en Python
- 4. ¿Cuál es el propósito del cargador de la clase Java?
- 5. ¿Cuál es el propósito de la clase Expression?
- 6. ¿Cuál es el propósito en itertools.repeat de Python?
- 7. ¿Cuál es el propósito de typedefing una clase en C++?
- 8. ¿Cuál es el propósito de la finalización en Java?
- 9. ¿Cuál es el propósito de Mage_Core_Block_Template_Facade
- 10. ¿Cuál es el propósito de 'Class.forName ("MY_JDBC_DRIVER")'?
- 11. ¿Cuál es el propósito de String.IsInterned?
- 12. ¿Cuál es el propósito de IntentSender?
- 13. ¿cuál es el propósito de Thread.holdsLock (lock)?
- 14. ¿Cuál es el propósito de la serialización en Java?
- 15. ¿Cuál es el propósito de :: en C#?
- 16. ¿Cuál es el propósito de Membership.ValidateUser()
- 17. ¿cuál es el objeto Clase (java.lang.Class)?
- 18. ¿Cuál es el propósito del modificador -m?
- 19. ¿Cuál es el propósito de precompiledApp.config?
- 20. ¿Cuál es el propósito de la propiedad webkitRelativePath en el objeto File?
- 21. ¿Cuál es el propósito del uso?
- 22. ¿Cuál es el propósito de la interfaz de marcador?
- 23. ¿Cuál es el propósito del método setSelector en la clase NSInvocation?
- 24. ¿Cuál es el propósito de `qt_noop`
- 25. ¿Cuál es el propósito de layout.xml?
- 26. ¿Cuál es el propósito de requestWindowFeature()?
- 27. ¿Cuál es el propósito de la tilde en esta situación?
- 28. ¿Cuál es el propósito de la bandera AI_V4MAPPED en getaddrinfo?
- 29. ¿Cuál es el propósito de la propiedad "privada" en package.json?
- 30. ¿Cuál es el propósito de la directiva #define en C++?
@thetaiko enumera algunas otras cosas de estilo nuevo que son buenas de conocer. –
Para la posteridad, vale la pena mencionar que las clases de nuevo estilo son las predeterminadas en Python3 y la subclasificación de 'object' no es necesaria. – slightlynybbled