2008-12-01 25 views
36

class foo(object) es una forma antigua de la escuela de definir una clase. Pero me gustaría entender con más detalle la diferencia entre estos dos.Diferencia entre clase foo y clase foo (objeto) en Python

+0

Qué versión de Python estás usando. Desde el punto de vista 2.6/3.0, es una cosa. De versiones 2.5 (y anteriores), es diferente. ¿Qué estás usando en este momento? –

+1

posible duplicado de [¿Cuál es la diferencia entre el estilo antiguo y las nuevas clases de estilo en Python?] (Http: // stackoverflow.com/questions/54867/what-is-the-difference-between-old-style-and-new-style-classes-in-python) – vaultah

+0

@Wendy Parece que ha tenido algunos años para pensarlo ahora , ¿podrías elegir una respuesta a esta pregunta? Incluso parece que la comunidad ha hecho una sugerencia. ;-) – Zak

Respuesta

11

class foo(object): es la 'nueva' forma de declarar clases.

Este cambio se realizó en python 2.2, consulte this PEP for an explanation de las diferencias.

+3

Sería más exacto decir "la forma de declarar clases de nuevo estilo". Por cierto, comenzando con python 3.0 "clase foo:" es una clase de nuevo estilo. –

4

Subclase object produce una nueva clase de estilo. Dos ventajas bien conocidas de las clases de nuevo estilo son:

  • metaclases (como la clase fábricas, pero funciona de forma transparente)
  • Propiedades (getters & set ...)
+1

En realidad, las metaclases también funcionarán para las clases de estilo anterior. Algunas funcionalidades de propiedad también funcionarán (getters, pero no setters) – Brian

38

Antes de Python 2.2 no eran esencialmente dos tipos diferentes de clases: las definidas por extensiones C y compilaciones internas codificadas por C (tipos) y aquellas definidas por sentencias (clases) de clase python. Esto generó problemas cuando quería mezclar tipos de python y tipos integrados. La razón más común para esto es la subclasificación. Si desea subclasificar el tipo de lista en el código python, no tuvo suerte, por lo que se utilizaron varias soluciones alternativas, como la creación de subclase de la implementación de python puro de listas (en el módulo UserList).

Esto era bastante feo, así que en 2.2 había un move para unificar los tipos de python y built-in, incluida la capacidad de inherit de ellos. El resultado es "nuevas clases de estilo". Sin embargo, estas tienen algunas diferencias incompatibles con las clases de estilo antiguo, por lo que para la compatibilidad con versiones anteriores la sintaxis de clase simple crea una clase de estilo antiguo, mientras que el nuevo comportamiento se obtiene al heredar de un objeto. Las diferencias de comportamiento más visibles son:

  • El orden de resolución de método (MRO). Hay una diferencia de comportamiento en las jerarquías de herencia en forma de diamante (donde A hereda de B y C, que ambas heredan de una clase base común D. Anteriormente, los métodos se buscaban de izquierda a derecha, profundidad primero (es decir, ABDCD). si C sobrecarga a un miembro de D, A no lo utilizará A (ya que encuentra la implementación de D'primero) Esto es malo para varios estilos de programación (por ejemplo, usando clases mixin). Las nuevas clases de estilo tratarán esta situación como ABCD, (mirar el atributo __mro__ de una clase para ver el orden en que buscará)

  • se añade el constructor __new__, lo que permite a la clase para que actúe como un método de fábrica, en lugar de devolver una nueva instancia de la clase. Útil para devolver subclases particulares, o reutilizar objetos inmutables en lugar de crear nuevos sin tener que cambiar la creación en terface

  • Descriptors. Estas son las características detrás de cosas tales como propiedades, classmethods, métodos estáticos, etc. Básicamente, proporcionan una forma de controlar lo que sucede cuando accede o establece un atributo en particular en una clase (nuevo estilo).

Cuestiones relacionadas