2011-02-05 25 views
8

Si define una clase en Python, tales como:Herencia por defecto de Python?

class AClass: 
    __slots__ = ['a', 'b', 'c'] 

Qué clase no se heredan de? No parece heredar de object.

+0

Todas las respuestas con respecto a "objeto" y clases antiguas frente a nuevas son correctas, pero ¿por qué preguntas? ¿Hay alguna razón práctica o es solo una cuestión de diseño filosófico/de lenguaje? (¡Porque en la mayoría de los casos, no importa!) –

+0

¿Qué versión de Python? Python 2 y Python 3 hacen esto de manera diferente. –

+0

Creo que estaba tratando de extender esta clase, pero no me permitió extenderla hasta que lo heredé de Object. – Verhogen

Respuesta

11

Si define una clase y no declara ningún elemento primario específico, la clase se convierte en una "clase clásica", que se comporta de forma un poco diferente a las "clases de estilo nuevo" heredadas del objeto. Consulte aquí para obtener más detalles: http://docs.python.org/release/2.5.2/ref/node33.html

Las clases clásicas no tienen una raíz común, por lo que esencialmente, su AClass no hereda de ninguna clase.

Tenga en cuenta que esto es específico de las versiones de Python anteriores a la 3.0. En Python 3, todas las clases son de estilo nuevo y heredan implícitamente del objeto, si no se declara ningún otro padre.

2

En Python 2.xo posterior, su ejemplo AClass es una clase "antigua".

Una clase de "nuevo estilo" tiene una herencia definida y debe heredar de un objeto o de otra clase.

What is the difference between old style and new style classes in Python?

EDITAR

: Vaya, yo no creía que fuera posible utilizar la sintaxis de estilo antiguo en Python 3.x Pero lo probé y esa sintaxis aún funciona. Pero obtienes una clase de estilo nuevo.

2

Probémoslo.

>>> class AClass: 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((), <type 'classobj'>)    # inherits from nothing 

>>> class AClass(object):    # new style inherits from object 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((<type 'object'>,), <type 'type'>) 

Lea una introducción a las nuevas clases de estilo en los enlaces que figuran en otras respuestas.

8

Prueba el siguiente fragmento de código en Python 2.7 y Python 3,1

class AClass: 
    __slots__ = ['a', 'b', 'c'] 
print(type(AClass)) 
print(issubclass(AClass,object)) 
print(isinstance(AClass,type)) 

En Python 2.7, obtendrá:

<type 'classobj'> 
False 
False 

y Python 3.1 obtendrá.

<class type> 
True 
True 

Y eso lo explica todo. Es una clase de estilo antiguo en Python 2, a menos que la subclases desde object. Solo en Python3, se tratará como una nueva clase de estilo de forma predeterminada.