Classes et objets

PythonBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous allez apprendre à utiliser les classes et les objets en Python. Une classe est un modèle pour créer des objets. Un objet est une instance d'une classe.

Réalisations

  • Noms et objets
  • Portées et espaces de noms
  • Objets d'instance
  • Objets de méthode
  • Héritage
  • Variables privées

Définition et création d'une classe

Pour définir une classe en Python, utilisez le mot-clé class suivi du nom de la classe.

La définition de la classe doit contenir une méthode __init__, qui est une méthode spéciale en Python appelée lorsqu'un objet est créé à partir de la classe.

Ouvrez un nouvel interpréteur Python.

python3

Voici un exemple de classe représentant un cercle :

class Circle:
    def __init__(self, radius):
        self.radius = radius

La méthode __init__ prend un paramètre radius et l'assigne à l'attribut radius de l'objet.

Instanciation d'un objet d'instance

Pour créer un objet d'instance à partir d'une classe, vous devez appeler le nom de la classe suivi de parenthèses. On l'appelle une "instance" car il s'agit d'une occurrence spécifique de la classe.

circle1 = Circle(5)

Cela crée un objet d'instance circle1 de type Circle avec un rayon de 5. Les objets d'instance peuvent être utilisés pour stocker des données spécifiques à l'objet. Par exemple, chaque objet Circle peut avoir un rayon différent.

La méthode __init__ de l'étape précédente sera appelée automatiquement lorsque l'objet sera créé, et l'attribut radius de l'objet sera initialisé avec la valeur 5.

La méthode __init__ est souvent utilisée pour configurer l'état initial d'un objet, comme l'initialisation des attributs de l'objet ou la configuration de connexions à des ressources externes. Elle est appelée automatiquement lorsque l'objet est créé, vous n'avez donc pas besoin de l'appeler vous-même.

Il est important de noter que la méthode __init__ est simplement une méthode normale et peut avoir n'importe quel nom. Cependant, la convention de nommage recommandée est d'utiliser __init__ pour clarifier qu'il s'agit de la méthode d'initialisation de la classe.

Accès et modification d'attributs

Pour accéder aux attributs d'un objet, utilisez la notation pointée. Par exemple, pour accéder au rayon de l'objet circle1, vous pouvez utiliser le code suivant :

print(circle1.radius) ## Output: 5

Vous pouvez modifier les attributs d'un objet en leur assignant une nouvelle valeur. Par exemple, pour changer le rayon de l'objet circle1, vous pouvez utiliser le code suivant :

circle1.radius = 10
print(circle1.radius) ## Output: 10

Ajouter des objets méthode

Une méthode est une fonction définie à l'intérieur d'une classe et utilisée pour effectuer des opérations sur les données stockées dans les attributs d'un objet. En Python, les méthodes sont définies à l'aide du mot-clé def suivi du nom de la méthode et d'une liste de paramètres.

Voici un exemple de méthode area définie dans la classe Circle :

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

La méthode area calcule l'aire d'un cercle en fonction de son rayon. Elle le fait en utilisant l'attribut self.radius, qui fait référence au rayon de l'objet sur lequel la méthode est appelée.

Pour appeler une méthode sur un objet, utilisez la notation pointée suivie du nom de la méthode et de parenthèses. Par exemple, pour appeler la méthode area sur l'objet circle1, vous pouvez utiliser le code suivant :

circle1 = Circle(15)
print(circle1.area()) ## Output: 706.5

Cela affichera l'aire de l'objet circle1, qui est une instance spécifique de la classe Circle.

Les méthodes sont utiles pour encapsuler la fonctionnalité au sein d'une classe et fournir un moyen d'opérer sur les données stockées dans les attributs de l'objet.

Les débutants devraient faire particulièrement attention à l'utilisation des parenthèses. Les parenthèses sont utilisées pour appeler la méthode sur l'objet, et les parenthèses sont également utilisées pour passer les paramètres à la méthode. Cela peut être confus au début, mais cela deviendra plus clair au fur et à mesure que vous continuerez à apprendre les classes et les objets.

Les objets d'instance et les objets méthode sont les deux principaux types d'objets en Python. En conclusion, les objets d'instance sont créés à partir d'une classe, et les objets méthode sont définis à l'intérieur d'une classe.

Héritage

L'héritage est un moyen de créer une nouvelle classe qui est une version modifiée d'une classe existante. La nouvelle classe est appelée sous-classe et la classe existante est la super-classe.

L'héritage vous permet de créer une sous-classe qui possède tous les attributs et méthodes de la super-classe, et vous pouvez également ajouter des attributs et méthodes supplémentaires à la sous-classe ou remplacer les attributs et méthodes de la super-classe.

Voici un exemple d'une sous-classe Cylinder qui hérite de la classe Circle :

class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height

La classe Cylinder a une méthode __init__ qui prend deux paramètres : radius et height. Elle appelle la méthode __init__ de la classe Circle en utilisant la fonction super() pour initialiser l'attribut radius de l'objet, puis définit l'attribut height de l'objet.

La fonction super() est une fonction spéciale en Python qui fait référence à la super-classe d'une classe. Elle est utilisée pour appeler les méthodes de la super-classe depuis l'intérieur de la sous-classe.

La fonction super() est définie dans la définition de la classe et prend le paramètre self, qui fait référence à l'objet en cours de création. Elle peut également prendre des paramètres supplémentaires en fonction de la méthode appelée. Dans cet exemple, elle passe le paramètre radius à la méthode __init__ de la classe Circle et initialise l'attribut radius de l'objet.

La classe Cylinder possède maintenant tous les attributs et méthodes de la classe Circle, ainsi que l'attribut supplémentaire height. Vous pouvez accéder aux attributs et méthodes de la classe Cylinder en utilisant la notation pointée, tout comme avec la classe Circle.

Par exemple, vous pouvez créer un objet Cylinder et accéder à ses attributs comme suit :

cylinder1 = Cylinder(5, 10)
print(cylinder1.radius)  ## affiche 5
print(cylinder1.height)  ## affiche 10

L'héritage est une fonctionnalité utile en programmation orientée objet car il vous permet de réutiliser du code et de créer une hiérarchie de classes.

La fonction super()

La fonction super() est utile lorsque vous souhaitez réutiliser le code de la super-classe dans la sous-classe et l'étendre avec des fonctionnalités supplémentaires.

Il est important de noter que la fonction super() n'est pas une référence statique à la super-classe. C'est une référence dynamique qui change en fonction de la classe dans laquelle elle est appelée. Cela vous permet d'utiliser l'héritage sur plusieurs niveaux d'héritage et d'accéder à la bonne super-classe à chaque niveau.

Par exemple, considérez les classes suivantes :

class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        super().method()
        print("B method")

class C(B):
    def method(self):
        super().method()
        print("C method")

Ici, C est une sous-classe de B, qui est une sous-classe de A. Si vous appelez la méthode method sur un objet C, elle appellera d'abord la méthode method de la classe A en utilisant la fonction super(), puis la méthode method de la classe B en utilisant la fonction super(), et enfin la méthode method de la classe C.

obj = C()
obj.method()  ## affiche "A method", "B method", "C method"

La fonction super() est une fonctionnalité utile en programmation orientée objet qui vous permet de réutiliser du code et de créer une hiérarchie de classes.

Variables privées

En Python, les variables privées sont des variables destinées à être utilisées uniquement au sein de la classe dans laquelle elles sont définies, et non par le code externe. Les variables privées ne sont pas directement accessibles depuis l'extérieur de la classe.

Pour définir une variable privée dans la classe Circle, vous pouvez utiliser le préfixe double underscore (__) suivi du nom de la variable. Par exemple :

class Circle:
    def __init__(self, radius):
        self.__radius = radius

Cela définit une variable privée __radius dans la classe Circle.

Les variables privées sont destinées à être utilisées uniquement au sein de la classe dans laquelle elles sont définies. Elles ne sont pas directement accessibles depuis l'extérieur de la classe. Par exemple, si vous essayez d'accéder à la variable __radius depuis l'extérieur de la classe Circle, vous obtiendrez une erreur :

circle1 = Circle(5)
print(circle1.__radius)  ## Cela lèvera une erreur AttributeError

Les variables privées sont utiles pour encapsuler des données au sein d'une classe et limiter la capacité du code externe à les modifier. Cependant, il est important de noter que les variables privées ne sont pas véritablement privées en Python et peuvent toujours être accessibles depuis l'extérieur de la classe en utilisant le "name mangling" (renommage de nom).

Le "name mangling" est une technique qui consiste à ajouter un préfixe spécial au nom de la variable pour la rendre plus difficile d'accès depuis l'extérieur de la classe.

Par exemple, la variable __radius peut toujours être accessible depuis l'extérieur de la classe Circle en utilisant la syntaxe suivante :

print(circle1._Circle__radius)  ## Cela affichera 5

Cependant, cela n'est pas considéré comme une bonne pratique de programmation et devrait être évité.

Au lieu de cela, vous devriez utiliser les variables privées uniquement au sein de la classe dans laquelle elles sont définies et fournir des méthodes publiques pour accéder ou modifier les données si nécessaire.

Voici un exemple de classe Circle avec une variable privée __radius et des méthodes publiques pour accéder et modifier le rayon :

class Circle:
    def __init__(self, radius):
        self.__radius = radius

    def get_radius(self):
        return self.__radius

    def set_radius(self, radius):
        self.__radius = radius

Pour accéder au rayon d'un objet Circle, vous pouvez utiliser la méthode get_radius :

circle1 = Circle(5)
print(circle1.get_radius())  ## affiche 5

Pour modifier le rayon d'un objet Circle, vous pouvez utiliser la méthode set_radius :

circle1.set_radius(10)
print(circle1.get_radius())  ## affiche 10

Résumé

Dans ce laboratoire, vous avez appris à connaître les classes et les objets en Python. Vous avez appris à définir une classe, à créer un objet à partir d'une classe, à accéder aux attributs et méthodes d'un objet, à modifier les attributs d'un objet et à créer une sous-classe qui hérite d'une super-classe.

Voici un résumé des principaux concepts abordés dans ce laboratoire :

  • Une classe est un modèle pour créer des objets. Un objet est une instance d'une classe.
  • La méthode __init__ est appelée lorsqu'un objet est créé à partir d'une classe. Elle vous permet de définir les attributs de l'objet.
  • Vous pouvez accéder aux attributs d'un objet en utilisant la notation pointée, et appeler les méthodes d'un objet en utilisant la notation pointée suivie du nom de la méthode et de parenthèses.
  • Vous pouvez modifier les attributs d'un objet en leur assignant une nouvelle valeur.
  • L'héritage vous permet de créer une sous-classe qui est une version modifiée d'une super-classe. La sous-classe peut remplacer ou étendre les méthodes de la super-classe.

J'espère que ce laboratoire vous a aidé à apprendre les classes et les objets en Python. N'hésitez pas à me poser des questions si vous en avez!