Классы старого стиля, классы нового стиля и метаклассы

В Python 2.x все классы нового стиля наследуются от object неявно или явно. Тогда посмотрите на это:

>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>

Это значит A такое класс в новом стиле? Но A не наследуется от object в любом случае, верно?

>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>

в порядке, B это классический класс, не так ли?

>>> isinstance(A, object)
True
>>> isinstance(B, object)
True

почему случаи обоих A а также B случаи object?

Если B это пример object, затем type(B) не будет classobj, право?

2 ответа

О метаклассах вы можете прочитать здесь: http://docs.python.org/reference/datamodel.html. Обычно метаклассы предназначены для работы с новыми классами стилей. Когда вы пишете:

class M(type):
    pass

и вы используете:

class C:
    __metaclass__ = M

вы создадите новый объект стиля, потому что определяется способ M (реализация по умолчанию использует type создать новый класс стиля). Вы всегда можете реализовать свой собственный метакласс, который будет создавать классы старого стиля, используя types.ClassType,

О слотах вы можете прочитать здесь http://docs.python.org/release/2.5.2/ref/slots.html, фрагмент:

По умолчанию экземпляры классов как старого, так и нового стиля имеют словарь для хранения атрибутов.

Для классов нового стиля вы можете добавить __slots__тогда словарь для объекта не будет создан.

Другие вопросы по тегам