Lab 07: Metaclass Advanced

Time: 60 minutes | Level: Architect | Docker: docker run -it --rm python:3.11-slim bash

Overview

Metaclasses are the "classes of classes" — they control how classes are created. This lab covers __prepare__, metaclass __new__/__init__/__call__, conflict resolution, __init_subclass__, and building an ORM-style field registry.

Step 1: Metaclass Basics — type as a Metaclass

# type() is Python's built-in metaclass
# Every class is an instance of its metaclass

class MyClass:
    pass

print(f"type(MyClass): {type(MyClass)}")         # <class 'type'>
print(f"type(type): {type(type)}")               # <class 'type'>
print(f"isinstance(MyClass, type): {isinstance(MyClass, type)}")

# Creating a class dynamically with type()
DynamicClass = type(
    'DynamicClass',                # name
    (object,),                     # bases
    {                              # namespace
        'value': 42,
        'greet': lambda self: f"Hello from {type(self).__name__}",
    }
)

obj = DynamicClass()
print(f"DynamicClass().value: {obj.value}")
print(f"DynamicClass().greet(): {obj.greet()}")

💡 type(name, bases, namespace) is the core mechanism behind all class creation. Metaclasses just subclass type to customize this process.

Step 2: __prepare__ — Controlling the Class Namespace

📸 Verified Output:

Step 3: Metaclass __new__, __init__, __call__

Step 4: Singleton via Metaclass

Step 5: Metaclass Conflict Resolution

Step 6: __init_subclass__ — Hook Without Metaclass

Step 7: Class Decorators vs Metaclasses

Step 8: Capstone — ORM-Style Field Registry

📸 Verified Output:

Summary

Concept
Mechanism
Use Case

type() dynamic class

type(name, bases, ns)

Runtime class generation

__prepare__

Returns namespace dict

Custom class namespaces

Meta __new__

Class creation

Transform class before use

Meta __call__

Instance creation

Singleton, pooling

Metaclass conflict

Combined metaclass MRO

Multiple inheritance fix

__init_subclass__

Hook in base class

Plugin registry

Class decorator

@decorator on class

Simpler alternatives

ORM field registry

Metaclass + Descriptor

Django/SQLAlchemy style

Last updated