Metaclasses and Descriptors
Implementing Python metaclasses and descriptors — from new to descriptor protocol, init_subclass, and practical metaclass patterns.
When to Use
- Building DSLs and APIs with metaclasses
- Implementing property-like descriptors
- Automatic registration of subclasses
- ORM-like model definitions
Metaclass Patterns
class RegistryMeta(type):
registry = {}
def __new__(mcs, name, bases, namespace):
cls = super().__new__(mcs, name, bases, namespace)
if name != 'BaseModel':
mcs.registry[name] = cls
return cls
class BaseModel(metaclass=RegistryMeta): pass
class ValidatedField:
"""Descriptor pattern."""
def __init__(self, validator): self.validator = validator
def __set_name__(self, owner, name): self.name = name
def __get__(self, obj, objtype=None): return obj.__dict__.get(self.name)
def __set__(self, obj, value):
self.validator(value)
obj.__dict__[self.name] = value
Verification Checklist
- Metaclass new vs init understood
- Descriptor protocol (get, set, delete)
- set_name for automatic naming
- init_subclass as metaclass alternative (Python 3.6+)
- Practical use cases (registries, validation, ORMs)