issubclass permet de vérifier si une classe est une sous-classe d'une autre. C'est-à-dire si elle hérite directement ou indirectement d'une autre classe.
Attention
Attention à ne pas confondre issubclass et isinstance. Nous reviendrons sur cette différence par la suite.
D'ailleurs, n'hésitez à pas lire ou relire notre glossaire sur la fonction isinstance.
Syntaxe
La fonction issubclass prend deux arguments :
issubclass(classe, classe_ou_tuple_de_classes)
-
classe: La classe à vérifier -
classe_ou_tuple_de_classes: Une classe ou un tuple de classes avec lesquelles on compare la première classe
La fonction retourne True si classe est une sous-classe de classe_ou_tuple_de_classes, False dans le cas contraire.
Utilisation de base
Prenons un exemple simple d'héritage multiple :
class Animal: pass class Chien(Animal): pass class ChienDeChasse(Chien): pass class Reptile: pass # Chien est bien une sous-classe d'Animal print(issubclass(Chien, Animal)) # Résultat : True # ChienDeChasse est une sous-classe de Chien print(issubclass(ChienDeChasse, Animal)) # Résultat : True # En revanche, Animal n'est PAS une sous-classe de Chien print(issubclass(Animal, Chien)) # Résultat : False # Chien et Reptile n'ont pas de lien de parenté print(issubclass(Chien, Reptile)) # Résultat : False
À noter
Une classe est considérée comme une sous-classe d'elle-même.
class Animal: pass # Une classe est une sous-classe d'elle-même print(issubclass(Animal, Animal)) # True
Vérifier avec un tuple
Comme évoqué précédemment, nous pouvons passer un tuple de classes en deuxième argument à la fonction issubclass :
class Vehicule: pass class Voiture(Vehicule): pass class Bateau: pass # On vérifie si Voiture est une sous-classe de Bateau OU de Vehicule print(issubclass(Voiture, (Bateau, Vehicule))) # Résultat : True # On vérifie si Bateau est une sous-classe de Vehicule OU de Voiture print(issubclass(Bateau, (Vehicule, Voiture))) # Résultat : False
Dans ce cas, issubclass retourne True si la classe est une sous-classe d'au moins une des classes du tuple.
issubclass vs isinstance
On pourrait avoir tendance à confondre les deux fonctions. Imaginons deux classes A et B :
-
issubclass(A, B)vérifie si la classeAhérite directement ou indirectement de la classeB -
isinstance(obj, B)vérifie si l'objetobjest une instance de la classeBou l'une de ses sous-classes
Pour résumer : issubclass compare deux classes alors que isinstance compare un objet à une classe.
issubclass est donc pratique pour s'assurer qu'une classe fournie par un utilisateur respecte bien une interface, ou une hiérarchie de classes.