2010-04-26 13 views
13

He estado usando Python durante bastante tiempo, y todavía no estoy seguro de por qué subclase de object. ¿Cuál es la diferencia entre esto:¿Por qué sería necesario crear una subclase de un objeto en Python?

class MyClass(): 
    pass 

Y esto:

class MyClass(object): 
    pass 

Por lo que yo entiendo, object es la clase base para todas las clases y subclases la está implícito. ¿Obtienes algo de subclases explícitos de él? ¿Cuál es la cosa más "pitonica" que hacer?

Respuesta

12

Esto es oldstyle y nuevas clases de estilo en python 2.x. La segunda forma es la versión actualizada y existe desde python 2.2 y superior. Para el nuevo código, solo debe usar nuevas clases de estilo.

En Python 3.x puede volver a utilizar ambos formularios de forma indiferente, ya que el nuevo estilo es el único que queda y ambos formularios son realmente equivalentes. Sin embargo, creo que deberías continuar usando el formulario MyClass(object) incluso para el código 3.x al menos hasta que python 3.x sea ampliamente adoptado para evitar cualquier malentendido con lectores potenciales de tu código utilizados para 2.x.

El comportamiento entre el estilo antiguo y las nuevas clases de estilo es muy diferente con respecto a ciertas características como el uso de super().

Ver aquí: New Style classes

también se puede ver en here SO.

+1

No válido para 3.X –

+0

@Noctis - what no es válido para 3.x? El viejo estilo? La diferencia entre viejo/nuevo? – phkahler

+0

Heredar de 'Objeto' es el comportamiento predeterminado para Python 3.x –

7

de acuerdo con @kriss, @Noctis y @Carson. más color de mí:

class X: pass y class X(): pass son sinónimos de clases clásicos mientras class X(object): pass es para clases de nuevo estilo, como se puede ver aquí:

>>> class X:pass 
... 
>>> class Y(): pass 
... 
>>> class Z(object): pass 
... 
>>> 
>>> type(X), type(Y), type(Z) 
(<type 'classobj'>, <type 'classobj'>, <type 'type'>) 

vistazo a la Linky proporcionada por @kriss para más detalles sobre las diferencias. lo que no es válido en Python 3 es el concepto de la clase clásica ... la razón es porque las clases clásicas han quedado obsoletas. las tres expresiones idiomáticas crean solo clases de estilo nuevo en cualquier 3.x:

>>> class X:pass 
... 
>>> class Y(): pass 
... 
>>> class Z(object): pass 
... 
>>> 
>>> type(X), type(Y), type(Z) 
(<class 'type'>, <class 'type'>, <class 'type'>) 

¿Qué significa esto? si está codificando en Python 2, intente utilizar las clases de estilo nuevo tanto como sea posible. de esta manera, ya ha incorporado su ruta de migración. además las clases de estilo nuevo ofrecen más características que las clases clásicas. (Esto es algo subjetivo, pero si sus clases [clásicas] son ​​relativamente simples, entonces es posible que no necesite hacer nada para que funcionen en Python 3.)

+1

+1 buen ejemplo. –

Cuestiones relacionadas