Classes¶

Voici une classe :

In [1]:
class Dog:
    species = "canis lupus"   # species is a class variable
    
    def __init__(self, name): # __init__ is the constructor
        self.name = name      # self.name is an object variable
    
    def sound(self):          # sound is a method (a method is a function of an object)
        return "Woof, I am " + self.name

Les classes sont des entités utilisées pour regrouper des données et des fonctions décrivant un concept. Elles permettent d’organiser des projets dans des entités plus petites que le projet lui-même, ce qui offre les avantages suivants:

  • Les classes sont des concepts qui aident les humains à comprendre ce qu’ils font
  • Elles encapsulent des données et permettent de les masquer
  • Le débogage est plus simple car vous pouvez déboguer classe par classe
  • Les classes sont sûres, car plus faciles à déboguer et à tester qu'un programme complet (et utiliser des composants sûrs conduit à des programmes sûrs)
  • Les classes peuvent être réutilisées dans d'autres projets

Cela vaut la peine de prendre le temps de réfléchir à ce qu'est une classe

  • Qu'est-ce qu'un chien ?
  • Que dois-je pouvoir faire avec cette classe ?
  • Est-elle assez générique pour être réutilisé dans un autre projet ?
  • Est-ce que quelqu'un d'autre peut la comprendre et l'étendre ?

Une classe est un moule pour fabriquer des objets.

In [2]:
max = Dog('Max')  # max est un objet de la classe Dog

Vocabulaire¶

Pour pouvoir parler de classes et d'objets, définissons le vocabulaire introduit en commentaire dans la classe Dog.

L'astuce principale est que self se réfère à l'objet. Il n’est pas obligatoire d’utiliser le mot «self», mais c’est une convention que je conseille vivement de respecter. L'objet est le premier argument des méthodes.

Si quelque chose implique self, alors il est lié à l'objet et peut être :

  • une variables d'instance (également appelée variable d'objet)
  • une méthodes qui sont des fonctions d'une classe

S'il n'est pas lié à self, alors il est lié à la classe elle-même et peut être :

  • une variables de classe
  • une méthodes statiques (statiques car identiques pour tous les objets)

Toutes ces choses sont des attributs de la classe et des objets. Python dit que tout ce qui est après un point . est un attribut.

Pour résumer:

type nom de variable nom de fonction
objet variable d'instance méthode
classe variable de classe méthode statique

Objets¶

Pour créer un objet, vous devez simplement appeler le nom de la classe avec un argument si les méthodes d'initialisation en ont besoin.

Un objet peut utiliser les données et les fonctions de la classe :

In [3]:
max = Dog('Maximus')

print('%s says "%s"' % (max.name, max.sound()))  # Object attributes are called with a dot
print("He is a", max.species)                    # between the object name and its attribute
print("BTW all dogs are", Dog.species)           # Same for class attributes
Maximus says "Woof, I am Maximus"
He is a canis lupus
BTW all dogs are canis lupus

Méthode statique¶

Une méthode statique peut être faite de deux manières :

  • en la définissant dans la classe sans arguments
  • en décorant une fonction par @staticmethod (meilleur moyen, plus facile de voir que c'est une fonction statique)
In [4]:
class Dog:
    _classification = ['Animalia',
                      'Chordata',
                      'Synapsida',
                      'Mammalia',
                      'Carnivora',
                      'Caniformia',
                      'Canidae',
                      'Canis',
                      'Canis lupus',
                      'Canis lupus familiaris']
    
    @staticmethod
    def classification(level):   # no reference to self, the object
        return Dog._classification[-level:]
In [5]:
Dog.classification(3)
Out[5]:
['Canis', 'Canis lupus', 'Canis lupus familiaris']

Les méthodes statiques peuvent également être appelées à partir d'objets:

In [6]:
max = Dog()
max.classification(5)
Out[6]:
['Caniformia', 'Canidae', 'Canis', 'Canis lupus', 'Canis lupus familiaris']

{{ PreviousNext("../lesson2 Deeper in Python/12 xml.ipynb", "02 Inheritance.ipynb")}}

In [ ]: