1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| def auto_inherit_and_wrap(parent_cls, method_name, wrapper_name):
"""
Décorateur générique qui :
- Fait hériter la classe décorée de `parent_cls`
- Applique la méthode `wrapper_name` de `parent_cls` sur `method_name`
"""
def decorator(cls):
# 1. Ajout dynamique de la classe parente
if parent_cls not in cls.__bases__:
cls.__bases__ = (parent_cls,) + cls.__bases__
# 2. Récupération du décorateur depuis la classe parente
wrapper = getattr(parent_cls, wrapper_name, None)
# 3. Application du décorateur si la méthode cible existe dans la classe
if wrapper and method_name in cls.__dict__:
original_method = getattr(cls, method_name)
setattr(cls, method_name, wrapper(original_method))
return cls
return decorator
# --- EXEMPLE D'UTILISATION ---
class A:
def draw(self):
print("Dessin de A")
@staticmethod
def drawWrapper(func):
def wrapper(self, *args, **kwargs):
print(">> Début du dessin")
res = func(self, *args, **kwargs)
print(">> Fin du dessin")
return res
return wrapper
# On passe la classe parente, le nom de la méthode et le nom du wrapper
@auto_inherit_and_wrap(parent_cls=A, method_name="draw", wrapper_name="drawWrapper")
class B:
def draw(self):
print("Dessin de B")
b = B()
print(f"Hérite de A ? {isinstance(b, A)}") # True
b.draw() |
Partager