Advanced Python Patterns
Metaclasses, descriptors, and advanced OOP patterns.
Overview
Master advanced patterns.
Metaclass Pattern
class ValidatedMeta(type):
def __new__(cls, name, bases, attrs):
for key, value in attrs.items():
if hasattr(value, 'validate'):
attrs[key] = property(
lambda self, v=value: getattr(self, f'_{v.name}', None),
lambda self, v, key=key: setattr(self, f'_{key}', v)
)
return super().__new__(cls, name, bases, attrs)
class User(metaclass=ValidatedMeta):
name = str
age = int
Descriptor Pattern
class TypeChecked:
def __init__(self, expected_type):
self.expected_type = expected_type
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, objtype=None):
if obj is None:
return self
return getattr(obj, f'_{self.name}', None)
def __set__(self, obj, value):
if not isinstance(value, self.expected_type):
raise TypeError(f"{self.name} must be {self.expected_type}")
setattr(obj, f'_{self.name}', value)
class Person:
name = TypeChecked(str)
age = TypeChecked(int)
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
print(p.name) # Alice
Practice
Implement a plugin system using metaclasses.