Классы старого стиля, классы нового стиля и метаклассы
В 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__
тогда словарь для объекта не будет создан.