+++ title = "Couplage" weight = 2 +++ # Couplage ## Définition Un couplage décrit une relation entre deux classes. ## Exemple Ici on veut représenter des chats et des humains qui adoptent (on non) des chats. Tous les chats ont un nom, et tous les humains ont un prénom. On peut utiliser pour cela deux classes: `Chat` et `Humain`: ```python class Chat: def __init__(self, nom): self.nom = nom >>> chat = Chat("Monsieur Moustaches") >>> chat.nom 'Monsieur Moustaches' ``` ```python class Humain: def __init__(self, prénom): self.prénom = prénom >>> alice = Humain(prénom="Alice") >>> alice.prénom "Alice" ``` Maintenant on veut que les humains puissent adopter des chats. Pour cela, on peut rajouter la méthode `adopte` dans la classe `Humain`. Cette méthode va prendre un argument - une instance de la classe `Chat`: ```python class Humain: def __init__(self, prénom): self.prénom = prénom def adopte(self, chat): print(self.prénom, "adopte un chat") >>> boule_de_poils = Chat("Boule de Poils") >>> alice = Humain("Alice") >>> alice.adopte(boule_de_poils) "Alice adopte un chat" ``` On peut accéder au nom du chat depuis la méthode `adopte`, en utilisant la syntaxe `nom.attribut` vue précédemment: ```python class Humain: def __init__(self, prénom): self.prénom = prénom def adopte(self, chat): print(self.prénom, "adopte", chat.nom) >>> boule_de_poils = Chat("Boule de Poils") >>> alice = Humain("Alice") >>> alice.adopte(boule_de_poils) "Alice adopte Boule de Poils" ``` ## Couplage ```python class Humain: ... def adopte(self, chat): print(self.prénom, "adopte", chat.nom) ``` Notez également que nous avons écrit `chat.nom`. ainsi, la méthode `adopte()` ne peut être appelée que part une instance qui a un attribut `nom` - sinon on aura une erreur. Donc si on modifie la classe `Chat` et qu'on renomme l'attribut `nom` en `surnom` par exemple, la méthode `adopte()` de la classe `Humain` cessera de fonctionner: on dit qu'on a un *couplage* entre les classes `Chat` et `Humain`.