До Python 2.1 классы старого стиля были единственным доступным пользователю вариантом.
Понятие класса (в старом стиле) не связано с понятием типа:
если x
является экземпляром класса старого стиля, тогда x.__class__
обозначает класс x
, но type(x)
всегда равен <type
'instance'>
.
Это отражает тот факт, что все экземпляры старого стиля, независимо от
их класс, реализуется с помощью одного встроенного типа, называемого
экземпляр.
В Python 2.2 были введены новые классы для унификации понятий класса и типа .
Класс нового стиля - это просто определяемый пользователем тип, не больше, не меньше.
Если x является экземпляром класса нового стиля, то type(x)
обычно
так же, как x.__class__
(хотя это не гарантируется -
экземпляру класса нового стиля разрешено переопределять возвращаемое значение
для x.__class__
).
Основной мотивацией для введения классов нового стиля является предоставление единой объектной модели с полной метамоделью .
Он также имеет ряд непосредственных преимуществ, таких как способность
подкласс большинства встроенных типов, или введение «дескрипторов»,
которые включают вычисляемые свойства.
По соображениям совместимости классы по-прежнему в старом стиле по умолчанию .
Классы нового стиля создаются путем указания другого класса нового стиля
(т. е. тип) в качестве родительского класса или объект "тип верхнего уровня", если нет
нужен другой родитель.
Поведение классов в новом стиле отличается от поведения в старом стиле.
классы в ряде важных деталей в дополнение к тому, что тип
возвращается.
Некоторые из этих изменений являются фундаментальными для новой объектной модели, например,
способ вызова специальных методов. Другие "исправления", которые не могли
быть реализован раньше для проблем совместимости, как метод
порядок разрешения при множественном наследовании.
В Python 3 есть только классы нового стиля .
Независимо от того, подкласс от object
или нет, классы в новом стиле
в Python 3.