__init_subclass__ — Expert Playground
Called when a class is subclassed; hook for parent class customization
Python Playground
# __init_subclass__ with metaclasses
class AutoReprMeta(type):
def __new__(mcs, name, bases, namespace):
cls = super().__new__(mcs, name, bases, namespace)
# Auto-generate __repr__ from __init__ params
init = namespace.get("__init__")
if init:
import inspect
params = list(inspect.signature(init).parameters.keys())[1:]
def auto_repr(self):
args = ", ".join(f"{p}={getattr(self, p)!r}" for p in params)
return f"{type(self).__name__}({args})"
cls.__repr__ = auto_repr
return cls
class Point(metaclass=AutoReprMeta):
def __init__(self, x, y):
self.x = x
self.y = y
class Person(metaclass=AutoReprMeta):
def __init__(self, name, age):
self.name = name
self.age = age
print(Point(3, 4))
print(Person("Alice", 30))
# MRO inspection
print(f"\nMRO: {[c.__name__ for c in Point.__mro__]}")
Output
Click "Run" to execute your code
Metaclass-level usage of __init_subclass__ lets you customize class creation and behavior at the deepest level.
Challenge
Try modifying the code above to explore different behaviors. Can you extend the example to handle a new use case?