New-style and classic classes¶
Classes and instances come in two flavors: old-style (or classic) and new-style.
Up to Python 2.1 the concept of class
was unrelated to the concept of
type
, and old-style classes were the only flavor available. For an
old-style class, the statement x.__class__
provides the class of x, but
type(x)
is always <type 'instance'>
. This reflects the fact that all
old-style instances, independent of their class, are implemented with a single
built-in type, called instance
.
New-style classes were introduced in Python 2.2 to unify the concepts of
class
and type
. A new-style class is simply a user-defined type,
no more, no less. If x is an instance of a new-style class, then type(x)
is typically the same as x.__class__
(although this is not guaranteed – a
new-style class instance is permitted to override the value returned for
x.__class__
).
The major motivation for introducing new-style classes is to provide a unified object model with a full meta-model. It also has a number of practical benefits, like the ability to subclass most built-in types, or the introduction of “descriptors”, which enable computed properties.
For compatibility reasons, classes are still old-style by default. New-style
classes are created by specifying another new-style class (i.e. a type) as a
parent class, or the “top-level type” object
if no other parent is
needed. The behaviour of new-style classes differs from that of old-style
classes in a number of important details in addition to what type()
returns. Some of these changes are fundamental to the new object model, like
the way special methods are invoked. Others are “fixes” that could not be
implemented before for compatibility concerns, like the method resolution order
in case of multiple inheritance.
While this manual aims to provide comprehensive coverage of Python’s class mechanics, it may still be lacking in some areas when it comes to its coverage of new-style classes. Please see https://www.python.org/doc/newstyle/ for sources of additional information.
Old-style classes are removed in Python 3, leaving only new-style classes.