Any object, even a class object, has a type. In Python, types and classes are also first-class objects. The type of a class object is also known as the class’s metaclass. An object’s behavior is mostly determined by the type of the object. This also holds for classes: a class’s behavior is mostly determined by the class’s metaclass. Metaclasses are an advanced subject, and you may want to skip the rest of this section on first reading. However, fully grasping metaclasses can help you obtain a deeper understanding of Python, and occasionally it can be useful to define your own custom metaclasses.
The distinction between legacy and new-style classes relies on the fact that each class’s behavior is determined by its metaclass. In other words, the reason legacy classes behave differently from new-style classes is that legacy and new-style classes are objects of different types (metaclasses):
class Classic: pass class Newstyle(object): pass print type(Classic) # prints: <type 'class'> print type(Newstyle) # prints: <type 'type'>
The type of
Classic is object
types.ClassType from standard module
types, while the type of
Newstyle is built-in object
type is also the metaclass of all Python built-in types, including itself (i.e.,
print type(type) also prints
To execute a
class statement, Python first collects the base classes into a tuple
t (an empty one if there are no base classes) and executes the class body in ...