Order of operations when instantiating classes
The order of operations during class instantiation is very important to keep in mind when debugging issues with dynamically created and/or modified classes. The instantiation of a class happens in the following order.
Finding the metaclass
The metaclass comes from either the explicitly given metaclass on the class or bases
, or by using the default type
metaclass.
For every class, the class itself and the bases, the first matching of the following will be used:
Explicitly given metaclass
Explicit metaclass from bases
type()
Note
Note that if no metaclass is found that is a subtype of all the candidate metaclasses, a
TypeError
will be raised. This scenario is not that likely to occur but certainly a possibility when using multiple inheritance/mixins with metaclasses.
Preparing the namespace
The class namespace is prepared through the metaclass selected previously. If the metaclass has a __prepare__
method, it will be called namespace = metaclass
.__prepare__...