L’approche objet permet de créer des structures de données et d’y associer des fonctionnalités.
La principale caractéristique du paradigme objet est d’associer étroitement les données et le code pour les traiter (principe de l’encapsulation).
Cette encapsulation se matérialise par la définition d’une classe d’objets.
La classe objet établit les types de données et y associe des fonctionnalités communes.
Les objets individuels sont créés à partir de la classe, par un mécanisme appelé instanciation : l’objet devient l’instance de la classe dont il provient.
Dans la terminologie objet, les données sont appelées attributs, tandis que les fonctions associées sont appelées méthodes.
Une classe se définit à partir du mot-clé class suivi du nom de celle-ci (qui commence par une majuscule).
Dans le cas où le nom est composé, on utilise la convention dite « camel case ».
class ExempleComportantPlusieursMots:
pass
Les objets encapsulent des propriétés et des méthodes.
La méthode appelée __init__ est le constructeur de nos futurs objets. Elle sera automatiquement appelée au moment de la création des objets de la classe.
Les méthodes prennent un premier paramètre désignant l’objet individuel auquel elles s’appliquent. Par convention ce paramètre est appelé self en Python.
La syntaxe générale pour l’appel d’une méthode s’effectue selon le format suivant : objet.methode(arguments).
Si la méthode requiert des paramètres, les arguments correspondants doivent être présents entre les parenthèses.
Les chaînes de documentation (help()) contribuent, quand elles sont présentes, à informer sur la classe et ses méthodes.
L’intérêt de la programmation objet est la possibilité de disposer de méthodes communes à des objets distincts dont les valeurs d’attributs peuvent être différentes.
États internes des objets
Le paradigme de programmation fonctionnelle repose sur l’absence d’état des fonctions. Le résultat d’une fonction ne dépend que des arguments fournis en entrée.
Le paradigme de programmation objet permet une conservation d’états internes : les objets contiennent non seulement des fonctions, appelées méthodes, mais aussi des variables, appelées attributs.
On distingue :
les variables d’instance ;
et les variables de classe.
Les variables d’instance peuvent être définies au moment de l’instanciation de l’objet, mais il est possible de les définir à tout moment.
Les variables des objets, ou attributs d’instance, sont accessibles et modifiables avec la notation pointée.
Python permet également de déclarer librement des attributs non explicitement définis dans la classe.
Les variables d’instance sont stockées dans l’objet sous forme d’un dictionnaire.
Les variables peuvent également être définies au niveau de la classe (variables de classe).
Dans ce cas, elles sont communes à tous ses membres, et toute modification d’une variable de classe concernera l’ensemble des objets qui y sont rattachés (absence de self).
Certains langages obligent à utiliser des méthodes (accesseur ou mutateur) pour lire ou modifier les attributs des objets.
L’interface propose une forme d’accès aux données qui n’est pas nécessairement représentative de leur structure interne.
Cette structure interne peut donc être modifiée tout en conservant à l’identique l’interface.
Fonctionnalités
On distingue deux types de méthodes en Python :
les méthodes normales (qui correspondent aux fonctions de la programmation fonctionnelle) ;
et les méthodes spéciales (qui se distinguent par leur nommage entouré d’underscores = __methodespeciale__).
Ces dernières permettent d’étendre les fonctionnalités des objets en leur conférant des caractéristiques particulières (cf. __init__).
L’implémentation de la méthode spéciale __len__ va nous permettre de connaître la longueur d’un objet.
haiku = Poeme(petit_poeme_japonais)
print(len(haiku)) # affiche 60
Les méthodes spéciales nous permettent également d’implémenter des comparaisons entre objets, sous réserve de définir les méthodes correspondantes.
Cela implique l’implémentation des méthodes spéciales __lt__ (pour lesser than, soit « plus petit que ») et __le__ (pour lesser or equal, soit « plus petit que ou égal à »).