Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
__init_subclass__ : validation des sous-classes
__init_subclass__ est une méthode speciale appelee automatiquement quand une classe herite de ta classe. C'est un moyen leger de controler ce que les sous-classes ont le droit de faire.
C'est comme un chef d'equipe qui vérifie que chaque nouveau membre a bien son badge avec son nom. Si quelqu'un arrive sans badge, il est refuse.
Exemple : class Base: def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) if not hasattr(cls, 'version'): raise TypeError(cls.__name__ + ' doit definir version')
class Bonne(Base): version = '1.0' # OK
class Mauvaise(Base): # TypeError ! pass
Crée une classe de base Plugin qui utilise __init_subclass__ pour obliger chaque sous-classe a definir un attribut de classe nom. Si une sous-classe n'a pas de nom, leve une TypeError avec le message 'La classe XYZ doit definir l'attribut nom' (ou XYZ est le nom de la sous-classe).
Attention : vérifie 'nom' in cls.__dict__ plutot que hasattr(cls, 'nom'), pour t'assurer que la sous-classe definit elle-meme l'attribut (et ne l'herite pas).
Tests (2/4)
Sous-classe valide
class P(Plugin):
nom = 'test'
assert P.nom == 'test'
TypeError si pas de nom
try:
class Invalide(Plugin):
pass
assert False, 'Devait lever TypeError'
except TypeError:
pass
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
class Plugin:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
if not hasattr(cls, 'nom') or 'nom' not in cls.__dict__:
raise TypeError(f'La classe {cls.__name__} doit définir l\'attribut nom')