init_subclass validates class attributes at subclass creation.
1class ValidatedModel:2 def __init_subclass__(cls, **kwargs):3 super().__init_subclass__(**kwargs)4 # Validate required attributes5 for attr in ["table_name", "fields"]:6 if not hasattr(cls, attr):7 raise TypeError(f"{cls.__name__} must define {attr}")89 # Validate field types10 if hasattr(cls, "fields"):11 for field_name, field_type in cls.fields.items():12 if not isinstance(field_type, type):13 raise TypeError(f"Field {field_name} must be a type")1415class User(ValidatedModel):16 table_name = "users"17 fields = {18 "name": str,19 "email": str,20 "age": int,21 }2223class InvalidModel(ValidatedModel):24 pass # TypeError: InvalidModel must define table_name2526# Auto-registration with validation27class Handler:28 _handlers = {}2930 def __init_subclass__(cls, action=None, **kwargs):31 super().__init_subclass__(**kwargs)32 if action is None:33 raise ValueError("Handler must specify action")34 Handler._handlers[action] = cls3536class CreateUser(Handler, action="create_user"):37 def execute(self, data):38 return User.objects.create(**data)
Benefits: