Introduction
Metaclasses control class creation. They are the "classes of classes" in Python.
Basic Metaclass
class MyMeta(type):
def __new__(mcs, name, bases, namespace):
print(f"Creating class: {name}")
return super().__new__(mcs, name, bases, namespace)
class MyClass(metaclass=MyMeta):
pass
# Output: Creating class: MyClass
Enforcing Class Rules
class RequireMethods(type):
def __new__(mcs, name, bases, namespace):
cls = super().__new__(mcs, name, bases, namespace)
# Ensure class has required methods
if not hasattr(cls, 'validate'):
raise TypeError(f"{name} must have validate() method")
return cls
class Validator(metaclass=RequireMethods):
def validate(self):
pass # Implementation
Singleton Pattern
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Database(metaclass=Singleton):
pass
Practice Problems
- Create a metaclass that adds version attribute
- Implement singleton using metaclass
- Track all classes created with metaclass
- Create metaclass that auto-registers classes
- Validate class attributes with metaclass