Metaclasses
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.[2] An object’s
behavior is determined largely by the type of the object. This also
holds for classes: a class’s behavior is determined
largely by the class’s metaclass. Metaclasses are an
advanced subject, and you may want to skip the rest of this chapter
on first reading. However, fully grasping metaclasses can help you
obtain a deeper understanding of Python, and sometimes it can even be
useful to define your own custom metaclasses.
The distinction between classic and new-style classes relies on the fact that each class’s behavior is determined by its metaclass. In other words, the reason classic classes behave differently from new-style classes is that classic and new-style classes are object 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. type is also the
metaclass of all Python built-in types, including itself (i.e.,
print
type(type) also prints
<type 'type'>).
How Python Determines a Class’s Metaclass
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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access