Il arrive souvent de devoir effectuer une vérification avant d'exécuter un bloc de code. La fonction isinstance permet de déterminer si un objet est une instance de classe particulière.
Attention
Attention à ne pas confondre isinstance et issubclass. Nous reviendrons sur cette différence par la suite.
D'ailleurs, n'hésitez pas à lire ou relire notre glossaire sur issubclass.
Syntaxe
La fonction prend deux arguments :
isinstance(objet, classe_ou_tuple_de_classes)
-
objet: L'objet dont on veut vérifier le type -
classe_ou_tuple_de_classes: La classe à vérifier, ou un tuple de classes pour tester plusieurs types à la fois
La fonction retourne True si objet est une instance de classe_ou_tuple_de_classes (ou l'une de ses sous-classes), sinon False.
nombre = 42 texte = "Bonjour le monde" print(isinstance(nombre, int)) # Affiche: True print(isinstance(nombre, str)) # Affiche: False print(isinstance(texte, str)) # Affiche: True
Ci-dessus, un exemple très simple où l'on vérifie le type d'une variable.
Vérifier plusieurs types
Comme évoqué au début de cet article, isinstance permet aussi de vérifier aussi si une instance appartient à l'un des types spécifiés dans un tuple :
valeur = 123.45 # Est-ce que valeur est un entier OU un flottant ? if isinstance(valeur, (int, float)): print("La valeur est un nombre.") # Affiche: La valeur est un nombre. valeur2 = [1, 2, 3] # Est-ce que valeur2 est une chaîne OU une liste ? if isinstance(valeur2, (str, list)): print("La valeur est une chaîne ou une liste.") # Affiche: La valeur est une chaîne ou une liste.
Ce qui est pratique quand une fonction ou une méthode peut accepter différents types de données en entrée.
Héritage
isinstance tient compte de l'héritage. C'est-à-dire qu'un objet d'une classe enfant sera considéré comme une instance de la classe de base.
class Animal: pass class Chat(Animal): pass mon_chat = Chat() print(isinstance(mon_chat, Chat)) # Affiche: True print(isinstance(mon_chat, Animal)) # Affiche: True, car Chat hérite de Animal
isintance vs type
type(objet) == Classe est différent de isinstance(objet, classe) :
-
typevérifie une correspondance exacte avec la classe -
isinstancevérifie si l'objet fait partie de la hiérarchie de la classe (la classe elle-même ou l'une des classes parentes)
Reprenons l'exemple précédent :
class Animal: pass class Chat(Animal): pass mon_chat = Chat() # L'instance de Chat est bien un Chat, ET aussi un Animal par héritage. print(isinstance(mon_chat, Chat)) # Affiche: True print(isinstance(mon_chat, Animal)) # Affiche: True # Le type est exactement Chat, mais pas exactement Animal. print(type(mon_chat) == Chat) # Affiche: True print(type(mon_chat) == Animal) # Affiche: False
isinstance vs issubclass
On pourrait avoir tendance à confondre les deux fonctions. Imaginons deux classes A et B :
-
isinstance(obj, B)vérifie si l'objetobjest une instance de la classeBou l'une de ses sous-classes -
issubclass(A, B)vérifie si la classeAhérite directement ou indirectement de la classeB
Pour résumer : isinstance compare un objet à une classe alors que issubclass compare deux classes.