2012-05-08 12 views
5

De acuerdo con el documento, object es la clase base de todas las clases de estilo nuevo.Base de clases de estilo nuevo de Python - `objeto` y` tipo`

Y AFAIK, las llamadas clases de nuevo estilo son solo las que pueden adquirir algunas nuevas características al heredar object, ¿verdad?

pensé object heredan type o uso type como su __metaclass__, pero object.__bases__ me da nada, así que donde esta dosis object vienen, y lo que es la relación bewteen y type?

Respuesta

5

De hecho, el tipo (es decir, Metaclase) de object, una clase, es type:

type(object) == type  # True 

Y puesto object es la clase base, que no tiene padres de su propia, como era de esperar:

object.__bases__ ==() # True 

object doesn No tiene un atributo __metaclass__ porque no necesita uno: usa la metaclase predeterminada, type.

Ahora que es un poco confuso porque type es, de hecho, una subclase de object, que perturba la mente (¿cómo puede type derivarse de object cuando se necesita type a construirobject?), Pero esto se resuelve con un poco difícil -codificación en el nivel C en el intérprete de Python.

Todo esto se aplica solo a las clases de estilo nuevo, es decir, aquellas derivadas de object. En Python 3, todas las clases son de estilo nuevo, por lo que esto se aplica globalmente en Python 3.

+1

usa la metaclase predeterminada? ¿Quiere decir que si defino una clase (que no hereda 'objeto') sin especificar su metaclase, esta clase se construirá con' tipo'? – Alcott

+1

Bueno, sí, creo que sí. – Alcott

+1

Sí. 'type' es la metaclase que usa Python si no especifica una metaclase. – kindall

3

Hay dos conceptos que podrían ser útiles a tener en cuenta:

  • todo en Python es un objeto, incluyendo las clases y metaclases
  • metaclases son los constructores de clases, no a sus antepasados, por lo que no aparece en __bases__.

Eso significa que object de hecho tiene type como metaclase.

Como curiosidad, la parte "paradójica" de la historia es type, que al ser una metaclase también es un objeto, pero no puede tener como metaclase (sería un poco de pollo y huevo problema, si lo piensas).

La paradoja se resuelve con algo de C vudú en el código fuente de la pitón, ¡pero no sé mucho al respecto!

EDIT: (un código de ejemplo)

>>> class MyMeta(type): 
...  def __new__(cls, name, bases, dct): 
...   return type.__new__(cls, name, bases, dct) 
... 
>>> class MyClass(object): 
...  __metaclass__ = MyMeta 
... 

Ahora observamos que obj Heredar del object

>>> obj = MyClass() 
>>> MyClass.__bases__ 
(<type 'object'>,) 

cuanto a su pregunta en los comentarios sobre dir(obj) no emitirá el atributo __metaclass__ : el motivo es que __metaclass__ es un atributo de la clase no de su instancia objeto. Tenga en cuenta, de hecho, de que: (con una respuesta muy amplia, por supuesto)

>>> dir(MyClass) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 
>>> MyClass.__metaclass__ 
<class '__main__.MyMeta'> 

Si usted está interesado en profundizar su comprensión de metaclases, este es un clásico SO pregunta:

What is a metaclass in Python?

HTH!

+0

Bueno, en realidad piensan que '' type' es metaclase de object', pero 'dir (objeto)' ni siquiera tiene un atributo como '__metaclass__' , ¿por qué? – Alcott

+1

Porque 'type' se usa de forma predeterminada. '__metaclass__' se puede usar para anularlo. – yak

+0

Gracias por los ejemplos de códigos elaborativos. – Alcott

2

Puede encontrar this y this publicaciones interesantes. Aquí está el diagrama de la primera:

enter image description here

+0

Bueno, 'object' es la base de' type'? – Alcott

+0

@Alcott: sí, lo es. Y 'tipo' es el tipo de' objeto'. Lea los artículos vinculados y otros artículos relevantes del blog para obtener una explicación más detallada –

Cuestiones relacionadas