À quoi sert la fonction isinstance ?

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)
PYTHON
  • 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
PYTHON
Un instant

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.
PYTHON
Un instant

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
PYTHON
Un instant

isintance vs type

type(objet) == Classe est différent de isinstance(objet, classe) :

  • type vérifie une correspondance exacte avec la classe

  • isinstance vé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
PYTHON
Un instant

isinstance vs issubclass

On pourrait avoir tendance à confondre les deux fonctions. Imaginons deux classes A et B :

  • isinstance(obj, B) vérifie si l'objet obj est une instance de la classe B ou l'une de ses sous-classes

  • issubclass(A, B) vérifie si la classe A hérite directement ou indirectement de la classe B

Pour résumer : isinstance compare un objet à une classe alors que issubclass compare deux classes.

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.