Metaclass is the class of a class. Controls how classes are created.
1class SingletonMeta(type):2 _instances = {}34 def __call__(cls, *args, **kwargs):5 if cls not in cls._instances:6 cls._instances[cls] = super().__call__(*args, **kwargs)7 return cls._instances[cls]89class Database(metaclass=SingletonMeta):10 def __init__(self):11 self.connection = "connected"1213db1 = Database()14db2 = Database()15print(db1 is db2) # True — same instance1617# Validation metaclass18class ValidatedMeta(type):19 def __new__(mcs, name, bases, namespace):20 for key, value in namespace.items():21 if isinstance(value, str) and not key.startswith("_"):22 if not key.isupper():23 raise ValueError(f"{key} must be UPPERCASE")24 return super().__new__(mcs, name, bases, namespace)2526class Config(metaclass=ValidatedMeta):27 API_KEY = "secret" # OK28 # api_key = "secret" # ValueError!
When to use:
Prefer: __init_subclass__ for simpler cases.