python - objects - class ClassName versus class ClassName(objeto)
python class variables (2)
En Python 2.x, cuando hereda de "objeto", su clase es una clase de "nuevo estilo", que se implementó en Python 2.2 (alrededor de 2001) - El caso no heredado de "objeto" crea una clase de "estilo antiguo" , que en realidad se mantuvo sólo por compatibilidad con versiones anteriores.
La gran ventaja de las clases de "nuevo estilo" es la unificación de tipos en Python: antes de eso, uno no podía subclasificar tipos incorporados como int, list, dict, correctamente. También se especificó un "protocolo descriptor" que describe un protocolo para recuperar y configurar atributos en un objeto, lo que le da al lenguaje mucha flexibilidad. (Es más visible cuando uno usa una "propiedad" de Python en una clase).
Lo que sí marca la diferencia no es en realidad "heredar de un objeto", pero, dado que las clases en Python también son objetos, eso sí cambia la clase de clase (una clase de clase se conoce como su "metaclase"). Por lo tanto, si configura la metaclase como "tipo", no necesita heredar del objeto para tener una nueva clase de estilo.
Se recomienda encarecidamente que en Python 2.x, todas sus clases sean de nuevo estilo. El uso de clases de estilo antiguo puede funcionar para algunos casos simples y sencillos, pero puede generar muchos errores sutiles y difíciles de encontrar cuando intenta usar Propiedades, pickle, descriptores y otras características avanzadas. Sobre todo, cuando intenta verificar el "tipo" de un objeto, será el mismo (tipo "instancia") para todos los objetos de las clases de estilo antiguo, incluso si son de diferentes clases definidas por el usuario.
En las versiones 3.x de Python, todas las clases son de estilo nuevo, no es necesario configurar la metaclase.
El "modelo de datos" de la documentación de Python es el "libro de la ley" en el que el comportamiento de ambos tipos de clases se define en detalle (lo suficiente como para permitir que uno vuelva a implementar el lenguaje):
http://docs.python.org/reference/datamodel.html
Esta publicación del blog de Guido habla sobre las motivaciones detrás de las nuevas clases de estilo en un lenguaje más ligero:
http://python-history.blogspot.com.br/2010/06/new-style-classes.html
Esta pregunta ya tiene una respuesta aquí:
- Clase Python hereda objeto 6 respuestas.
Cuál es la diferencia entre:
class ClassName(object):
pass
y
class ClassName:
pass
Cuando llamo a la función de ayuda del módulo de esas clases, puede leer ____builtin____.object
para el primer caso justo debajo del título de ayuda de CLASE. Para el segundo caso solo muestra el nombre de la clase. ¿Hay alguna diferencia funcional entre esas clases y / o posibles métodos de las mismas?
(Sé que la class Classname(ParentClassName)
tiene un uso funcional)
ClassName(object)
usa la nueva clase de estilo: http://docs.python.org/release/2.5.2/ref/node33.html
El segundo ejemplo demuestra una clase de estilo antiguo.
En Python 3, las nuevas clases de estilo se utilizan de forma predeterminada y ya no necesitará subclasificar el object
.