Classes in Python are also objects.
This is a key concept. In Python, almost everything is an object, including both functions and classes. This means that functions and classes can be provided as arguments, exist as members of class instances, and do anything that any other object is capable of doing.
What else does it mean to say that classes are objects? Chapter 4, “Magic Methods,” discussed how object instantiation works. The
__init__ methods of the class are called, in that order, to create the new object. Classes are not an exception to this process. Classes themselves, being objects, are instances of another class, which is responsible for creating them.
The classes responsible for generating other classes are called metaclasses. “Meta-” is a Greek prefix that simply means “post-” or “after.” For example, a portion of Aristotle's work is called “The Physics,” and the subsequent portion is called “The Metaphysics,” which simply means “the stuff that comes after the physics.” However, the meaning assigned to this prefix has since evolved to refer to a level of self-reference—an instantiation of a concept in order to work on that concept. If you have ever been unfortunate enough to be forced to sit through a meeting to plan other meetings, that particular atrocity could rightly be called a meta-meeting.
This chapter covers metaclasses. First, it delves into the philosophy behind Python's object model, and how metaclasses, classes, and objects ...