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!
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
Bueno, sí, creo que sí. – Alcott
Sí. 'type' es la metaclase que usa Python si no especifica una metaclase. – kindall