Comment vérifier si une classe a un attribut spécifique en Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), vous apprendrez à vérifier si une classe possède un attribut spécifique en Python. Le laboratoire se concentre sur la compréhension des attributs de classe, qui sont des variables partagées par toutes les instances d'une classe, et sur la différenciation entre ces attributs de classe et les attributs d'instance.

Le laboratoire vous guide dans la création d'une classe Dog avec un attribut de classe species et des attributs d'instance name et age. Vous apprendrez à accéder aux deux types d'attributs et à observer comment la modification d'un attribut de classe affecte toutes les instances. Ensuite, le laboratoire présentera et utilisera les fonctions hasattr() et getattr() pour vérifier en toute sécurité et accéder aux attributs au sein d'une classe.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/encapsulation("Encapsulation") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") subgraph Lab Skills python/build_in_functions -.-> lab-559500{{"Comment vérifier si une classe a un attribut spécifique en Python"}} python/classes_objects -.-> lab-559500{{"Comment vérifier si une classe a un attribut spécifique en Python"}} python/encapsulation -.-> lab-559500{{"Comment vérifier si une classe a un attribut spécifique en Python"}} python/catching_exceptions -.-> lab-559500{{"Comment vérifier si une classe a un attribut spécifique en Python"}} end

Comprendre les attributs de classe

Dans cette étape, vous apprendrez à propos des attributs de classe en Python. Les attributs de classe sont des variables définies à l'intérieur d'une classe et partagées par toutes les instances (objets) de cette classe. Ils sont différents des attributs d'instance, qui sont spécifiques à chaque instance. Comprendre les attributs de classe est essentiel pour concevoir des classes efficaces et organisées.

Commençons par créer une classe simple avec un attribut de classe :

  1. Ouvrez votre éditeur VS Code.

  2. Créez un nouveau fichier nommé class_attributes.py dans le répertoire ~/project.

    ~/project/class_attributes.py
  3. Ajoutez le code suivant au fichier class_attributes.py :

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    ## Creating instances of the Dog class
    dog1 = Dog("Buddy", 3)
    dog2 = Dog("Lucy", 5)
    
    ## Accessing the class attribute
    print(dog1.species)
    print(dog2.species)
    
    ## Accessing instance attributes
    print(dog1.name)
    print(dog2.name)

    Dans cet exemple, species est un attribut de classe car il est défini à l'intérieur de la classe Dog mais en dehors de toute méthode. name et age sont des attributs d'instance car ils sont définis à l'intérieur de la méthode __init__ et sont spécifiques à chaque instance de Dog.

  4. Exécutez le script class_attributes.py en utilisant la commande suivante dans le terminal :

    python class_attributes.py

    Vous devriez voir la sortie suivante :

    Canis familiaris
    Canis familiaris
    Buddy
    Lucy

    Comme vous pouvez le voir, tant dog1 que dog2 partagent la même valeur pour species, qui est "Canis familiaris". Cependant, ils ont des valeurs différentes pour name car name est un attribut d'instance.

  5. Maintenant, modifions l'attribut de classe et voyons comment cela affecte les instances :

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    ## Creating instances of the Dog class
    dog1 = Dog("Buddy", 3)
    dog2 = Dog("Lucy", 5)
    
    ## Accessing the class attribute
    print(dog1.species)
    print(dog2.species)
    
    ## Modifying the class attribute
    Dog.species = "New Species"
    
    ## Accessing the class attribute again
    print(dog1.species)
    print(dog2.species)
  6. Exécutez à nouveau le script class_attributes.py :

    python class_attributes.py

    Vous devriez voir la sortie suivante :

    Canis familiaris
    Canis familiaris
    New Species
    New Species

    Remarquez que lorsque nous modifions Dog.species, le changement est reflété dans dog1 et dog2 car ils partagent le même attribut de classe.

Cet exemple démontre le concept de base des attributs de classe. Ils sont partagés entre toutes les instances d'une classe et peuvent être modifiés en accédant directement à la classe.

Utiliser hasattr() sur la classe

Dans cette étape, vous apprendrez à utiliser la fonction hasattr() en Python pour vérifier si une classe ou un objet possède un attribut spécifique. Cette fonction est utile pour déterminer si un attribut existe avant de tenter de l'accéder, ce qui peut éviter les erreurs et rendre votre code plus robuste.

En vous appuyant sur l'exemple précédent, utilisons hasattr() pour vérifier l'existence d'attributs de classe et d'instance dans la classe Dog :

  1. Ouvrez le fichier class_attributes.py dans votre éditeur VS Code (le même fichier que vous avez créé à l'étape précédente).

    ~/project/class_attributes.py
  2. Modifiez le code pour inclure des vérifications hasattr() comme suit :

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    ## Creating an instance of the Dog class
    dog1 = Dog("Buddy", 3)
    
    ## Checking for the existence of class attributes
    print(hasattr(Dog, "species"))
    print(hasattr(Dog, "breed"))
    
    ## Checking for the existence of instance attributes
    print(hasattr(dog1, "name"))
    print(hasattr(dog1, "age"))
    print(hasattr(dog1, "breed"))

    Dans ce code, nous utilisons hasattr() pour vérifier si la classe Dog possède les attributs species et breed, et si l'instance dog1 possède les attributs name, age et breed.

  3. Exécutez le script class_attributes.py en utilisant la commande suivante dans le terminal :

    python class_attributes.py

    Vous devriez voir la sortie suivante :

    True
    False
    True
    True
    False

    La sortie montre que la classe Dog possède l'attribut species (True) mais pas l'attribut breed (False). De même, l'instance dog1 possède les attributs name et age (True) mais pas l'attribut breed (False).

hasattr() renvoie True si l'attribut existe et False sinon. Cela vous permet d'écrire un code conditionnel qui gère différents cas en fonction de la présence d'attributs. Par exemple, vous pourriez vouloir fournir une valeur par défaut si un attribut est manquant.

Cet exemple démontre comment utiliser hasattr() pour vérifier l'existence d'attributs dans une classe et ses instances. C'est une technique utile pour écrire un code plus flexible et robuste.

Accéder en toute sécurité avec getattr()

Dans cette étape, vous apprendrez à utiliser la fonction getattr() en Python pour accéder en toute sécurité aux attributs d'une classe ou d'un objet. La fonction getattr() vous permet de fournir une valeur par défaut si l'attribut n'existe pas, évitant ainsi les exceptions AttributeError et rendant votre code plus robuste.

En continuant avec l'exemple de la classe Dog, utilisons getattr() pour accéder à l'attribut breed, dont nous savons qu'il peut ne pas exister :

  1. Ouvrez le fichier class_attributes.py dans votre éditeur VS Code (le même fichier que vous avez utilisé dans les étapes précédentes).

    ~/project/class_attributes.py
  2. Modifiez le code pour inclure getattr() afin d'accéder en toute sécurité à l'attribut breed :

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    ## Creating an instance of the Dog class
    dog1 = Dog("Buddy", 3)
    
    ## Safely accessing the 'breed' attribute using getattr()
    breed = getattr(dog1, "breed", "Unknown")
    print(breed)
    
    ## Accessing existing attributes
    print(getattr(dog1, "name"))

    Dans ce code, nous utilisons getattr(dog1, "breed", "Unknown") pour tenter d'accéder à l'attribut breed de l'instance dog1. Si l'attribut breed n'existe pas, getattr() renverra la valeur par défaut "Unknown". Nous accédons également à l'attribut name existant en utilisant getattr().

  3. Exécutez le script class_attributes.py en utilisant la commande suivante dans le terminal :

    python class_attributes.py

    Vous devriez voir la sortie suivante :

    Unknown
    Buddy

    La sortie montre que puisque l'attribut breed n'existe pas, getattr() a renvoyé la valeur par défaut "Unknown". L'attribut name est accédé avec succès en utilisant getattr().

En utilisant getattr() avec une valeur par défaut, vous pouvez éviter les exceptions AttributeError et gérer les cas où un attribut peut être manquant. Cela rend votre code plus résilient et plus facile à maintenir.

Cet exemple démontre comment utiliser getattr() pour accéder en toute sécurité aux attributs d'une classe et de ses instances. C'est une technique précieuse pour écrire un code plus robuste et flexible.

Résumé

Dans ce laboratoire, vous avez appris à connaître les attributs de classe en Python, qui sont des variables définies à l'intérieur d'une classe et partagées par toutes les instances. Vous avez créé une classe Dog avec un attribut de classe species et des attributs d'instance name et age. Vous avez observé que toutes les instances de la classe Dog partagent la même valeur pour l'attribut species, tandis que chaque instance a ses propres valeurs uniques pour les attributs name et age.

Vous avez également exécuté le script class_attributes.py et vérifié la sortie, confirmant que les attributs de classe sont accessibles de la même manière que les attributs d'instance, mais qu'ils sont partagés entre toutes les instances de la classe.