До Python 2.1 классы старого стиля были единственной версией, доступной пользователю.
Концепция класса (старого стиля) не связана с концепцией типа: если x является экземпляром класса старого стиля, то x.__class__ обозначает класс x, но type(x) всегда <type 'instance'>.
Это отражает тот факт, что все экземпляры старого стиля, независимо от их класса, реализуются с помощью одного встроенного типа, называемого instance .
Классы нового стиля были введены в Python 2.2 для унификации понятий класса и типа. Класс нового стиля - это просто пользовательский тип, ни больше, ни меньше.
Если x является экземпляром класса нового стиля, то type(x) обычно это то же самое, что и x.__class__ (хотя это не гарантируется - экземпляру класса нового стиля разрешено переопределять значение, возвращаемое для x.__class__).
Основной мотивацией для внедрения классов нового стиля является предоставление унифицированной объектной модели с полной метамоделью.
У него также есть ряд непосредственных преимуществ, таких как возможность подкласса большинства встроенных типов или введение "дескрипторов", которые позволяют вычислять свойства.
По соображениям совместимости классы по умолчанию по-прежнему в старом стиле.
Классы нового стиля создаются путем указания другого класса нового стиля (т. Е. Типа) в качестве родительского класса или объекта "тип верхнего уровня", если другой родительский класс не требуется.
Поведение классов нового стиля отличается от поведения классов старого стиля рядом важных деталей в дополнение к тому, какой тип возвращается.
Некоторые из этих изменений являются фундаментальными для новой объектной модели, например, способ вызова специальных методов. Другие представляют собой "исправления", которые не могли быть реализованы ранее из соображений совместимости, например, порядок разрешения методов в случае множественного наследования.
В Python 3 есть только классы нового стиля.
Независимо от того, являетесь ли вы подклассом из object или нет, классы в Python 3 созданы в новом стиле.
Ответ 2
С точки зрения объявления:
Классы нового стиля наследуются от object или от другого класса нового стиля.
classNewStyleClass(object): pass
classAnotherNewStyleClass(NewStyleClass): pass
Классы старого стиля этого не делают.
classOldStyleClass(): pass
Примечание к Python 3:
Python 3 не поддерживает классы старого стиля, поэтому любая из указанных выше форм приводит к классу нового стиля.
Ответ 3
Важные изменения в поведении между классами старого и нового стилей
Классы нового стиля MRO сложнее синтезировать в одном английском предложении. Это подробно объясняется здесь. Одно из его свойств заключается в том, что поиск базового класса выполняется только после того, как были выполнены все его производные классы. У них есть __mro__ атрибут, который показывает порядок поиска.
classC(object): i = 0 classC1(C): pass classC2(C): i = 2 classC12(C1, C2): pass classC21(C2, C1): pass
# `'str'` is a new style object, so you can't raise it: try: raise'str' except TypeError: pass else: assertFalse
Ответ 4
Классы старого стиля по-прежнему немного быстрее для поиска атрибутов. Обычно это не важно, но может быть полезно в коде Python 2.x, чувствительном к производительности.:
В [3]: class A: ...: def __init__(self): ...: self.a = 'привет' ...:
В [4]: class B(object): ...: def __init__(self): ...: self.a = 'привет' ...:
В [6]: aobj = A() В [7]: bobj = B()
В [8]: %timeit aobj.a 10000000 циклов, лучшее из 3: 78,7 нс на цикл
В [10]: %timeit bobj.a 10000000 циклов, лучшее из 3: 86,9 нс на цикл