| |
| python:poo:poo [2023/07/04 09:36] – [4.1 Association unidirectionnelle] phil | python:poo:poo [2025/06/19 19:29] (Version actuelle) – modification externe 127.0.0.1 |
|---|
| |
| <pane id="tab-python_3"> | <pane id="tab-python_3"> |
| <callout type="warning" color="red" icon="true">**Il n'est pas possible de surcharger une méthode en Python**. À la place, on peut donner des valeurs par défaut aux arguments. Contrairement aux autres langages, l'objet sur lequel la méthode agit doit être nommé explicitement en premier paramètre. </callout> | <callout type="warning" title="self" color="red" icon="true">**Il n'est pas possible de surcharger une méthode en Python**. À la place, on peut donner des valeurs par défaut aux arguments. Contrairement aux autres langages, l'objet sur lequel la méthode agit doit être nommé explicitement en premier paramètre. </callout> |
| |
| == 1.3.1 Le constructeur == | == 1.3.1 Le constructeur == |
| Création d'une méthode statique getNombreDeMonstresEnVie() dans la classe Monstre pour connaître le nombre de monstres en vie. | Création d'une méthode statique getNombreDeMonstresEnVie() dans la classe Monstre pour connaître le nombre de monstres en vie. |
| |
| {{ :python:poo:monstre2static.png?nolink|}} | {{ :python:poo:monstre2static.png?nolink|Réalisé avec PynSource}} |
| <code python *.py> | <code python *.py> |
| class Monstre: | class Monstre: |
| Création d'une classe “Monstre” contenant trois attributs (+ le constructeur surchargé) et trois méthodes. | Création d'une classe “Monstre” contenant trois attributs (+ le constructeur surchargé) et trois méthodes. |
| |
| {{ :python:poo:vsclasse3.png?nolink|Réalisé avec VSCode}} | {{ :python:poo:vsclasse3.png?nolink|Réalisé avec Visual Studio}} |
| <code csharp *.cs> | <code csharp *.cs> |
| class Monstre { | class Monstre { |
| Création d'une méthode statique getNombreDeMonstresEnVie() dans la classe Monstre pour connaître le nombre de monstres en vie. \\ \\ | Création d'une méthode statique getNombreDeMonstresEnVie() dans la classe Monstre pour connaître le nombre de monstres en vie. \\ \\ |
| |
| {{ :python:poo:vsclasse4.png?nolink|}} | {{ :python:poo:vsclasse4.png?nolink|Réalisé avec Visual Studio}} |
| <code csharp *.cs> | <code csharp *.cs> |
| class Monstre { | class Monstre { |
| </code> | </code> |
| |
| {{ :python:poo:dracula.png?nolink&100|}} | {{ :python:poo:dracula.png?nolink&100|Réalisé avec Visual Studio}} |
| //Exemple// \\ | //Exemple// \\ |
| <code csharp *.cs> | <code csharp *.cs> |
| |
| ==== 3. Principe d'encapsulation ==== | ==== 3. Principe d'encapsulation ==== |
| <callout type="info" icon="true">En programmation, l’**encapsulation** désigne le principe de **regrouper des données brutes avec un ensemble de routines** permettant de les lire ou de les manipuler. Ce principe est souvent accompagné du **masquage** de ces données brutes afin de s’assurer que l’utilisateur ne contourne pas l’interface qui lui est destinée. <html><a href="https://fr.wikipedia.org/wiki/Encapsulation_(programmation)" target="_blank">Wikipédia</a></html></callout> | <callout type="info" title="Encapsulation" icon="true">En programmation, l’**encapsulation** désigne le principe de **regrouper des données brutes avec un ensemble de routines** permettant de les lire ou de les manipuler. Ce principe est souvent accompagné du **masquage** de ces données brutes afin de s’assurer que l’utilisateur ne contourne pas l’interface qui lui est destinée. <html><a href="https://fr.wikipedia.org/wiki/Encapsulation_(programmation)" target="_blank">Wikipédia</a></html></callout> |
| |
| <tabs> | <tabs> |
| |
| <pane id="tab-python_6"> | <pane id="tab-python_6"> |
| {{ :python:poo:monstre.png?nolink&150|}} | {{ :python:poo:monstre.png?nolink&150|Réalisé avec PynSource}} |
| |
| <callout type="warning" icon="true">En Python, pour **MASQUER** les attributs, c'est-à-dire les rendre **privés** afin qu'ils ne soient accessibles qu'aux méthodes de la classe, on fait précéder leur nom d'un double soulignement <nowiki>__</nowiki>.</callout> | <callout type="warning" icon="true">En Python, pour **MASQUER** les attributs, c'est-à-dire les rendre **privés** afin qu'ils ne soient accessibles qu'aux méthodes de la classe, on fait précéder leur nom d'un double soulignement <nowiki>__</nowiki>.</callout> |
| Les attributs de la classe “Monstre” sont masqués. Pour y accéder sans passer par les méthodes de l'objet, on définit les **propriétés** //Pos_x//, //Pos_y// et //PointDeVie//. | Les attributs de la classe “Monstre” sont masqués. Pour y accéder sans passer par les méthodes de l'objet, on définit les **propriétés** //Pos_x//, //Pos_y// et //PointDeVie//. |
| |
| {{ :python:poo:vsclasse5.png?nolink|}} | {{ :python:poo:vsclasse5.png?nolink|Réalisé avec Visual Studio}} |
| <code csharp *.cs> | <code csharp *.cs> |
| class Monstre | class Monstre |
| |
| ==== 4. Association entre classes ==== | ==== 4. Association entre classes ==== |
| <callout type="info" icon="true">//"La manière privilégiée pour permettre à **deux classes de communiquer par envoi de messages** consiste à ajouter aux attributs primitifs de la première un **attribut référent** de la seconde. La classe peut donc, tout à la fois, contenir des attributs et se constituer en nouveau type d'attribut. C'est grâce à ce mécanisme de typage particulier que, partout dans son code, la première classe pourra faire appel aux méthodes disponibles de la seconde."// //Bersini//</callout> | <callout type="info" title="Association de classes" icon="true">//"La manière privilégiée pour permettre à **deux classes de communiquer par envoi de messages** consiste à ajouter aux attributs primitifs de la première un **attribut référent** de la seconde. La classe peut donc, tout à la fois, contenir des attributs et se constituer en nouveau type d'attribut. C'est grâce à ce mécanisme de typage particulier que, partout dans son code, la première classe pourra faire appel aux méthodes disponibles de la seconde."// //Bersini//</callout> |
| {{ :python:poo:uml_classes_en.svg.png?nolink |}} | {{ :python:poo:uml_classes_en.svg.png?nolink |}} |
| |
| === 4.1 Association unidirectionnelle === | === 4.1 Association unidirectionnelle === |
| == 4.1.1 Exemple 1: Association unidirectionnelle simple - lien d'association == | == 4.1.1 Exemple 1: Lien d'association == |
| <tabs> | <tabs> |
| * [[#tab-python_7a|Python]] | * [[#tab-python_7a|Python]] |
| |
| <pane id="tab-python_7a"> | <pane id="tab-python_7a"> |
| {{ :python:poo:pyassociation1.png?nolink|}} | |
| Lecture du **diagramme de classes** : chaque objet O1 est associé à un objet O2. La réciproque n'est pas vraie. \\ O1 peut envoyer un message à O2 par le biais de l'association car : \\ | Lecture du **diagramme de classes** : chaque objet O1 est associé à un objet O2. La réciproque n'est pas vraie. \\ O1 peut envoyer un message à O2 par le biais de l'association car : \\ |
| * il possède un objet (référent) de type O2 dans ses champs | * il possède un objet (référent) de type O2 dans ses champs |
| * cet objet est initialisé avec O2 lors de la création de O1 | * cet objet est initialisé avec O2 lors de la création de O1 |
| | {{ :python:poo:pyassociation1.png?nolink|Réalisé avec PynSource}} |
| |
| <code python exemple1.py> | <code python exemple1.py> |
| * il possède un objet (référent) de type O2 dans ses champs | * il possède un objet (référent) de type O2 dans ses champs |
| * cet objet est initialisé avec O2 lors de la création de O1 | * cet objet est initialisé avec O2 lors de la création de O1 |
| {{ :python:poo:vsassociation1.png?nolink |}} | {{ :python:poo:vsassociation1.png?nolink |Réalisé avec Visual Studio}} |
| |
| <code csharp *.cs> | <code csharp *.cs> |
| </tabs> | </tabs> |
| |
| == 4.1.2 Exemple 2 - Association unidirectionnel - lien de composition == | == 4.1.2 Exemple 2 - Lien de composition == |
| <tabs> | <tabs> |
| * [[#tab-python_7b|Python]] | * [[#tab-python_7b|Python]] |
| |
| <pane id="tab-python_7b"> | <pane id="tab-python_7b"> |
| | {{ :python:poo:estomacdracula.png?nolink|Réalisé avec PynSource}} |
| | Lecture du **diagramme de classes** : Dracula se** compose** de différents organes dont un estomac. Si Dracula disparaît, son estomac aussi. |
| | {{ :python:poo:pycomposition.png?nolink |Réalisé avec PynSource}} |
| | |
| | <code python *.py> |
| | class Estomac: |
| | pass |
| | |
| | class Monstre: |
| | def __init__(self, nom, x=0, y=0, pv=100): |
| | self.__nom = nom |
| | self.__pos_x = x # Un attributs (où variable d'instance) |
| | self.__pos_y = y # est rendu privé par : __ |
| | self.__pointsDeVie = pv # exemple self.__posx |
| | self.__estomac = Estomac() |
| | Monstre.__nombreDeMonstres += 1 |
| | |
| | # Programme |
| | dracula = Monstre("Dracula", verreDeSang) |
| | </code> |
| </pane> | </pane> |
| |
| <pane id="tab-csharp_7b"> | <pane id="tab-csharp_7b"> |
| | {{ :python:poo:estomacdracula.png?nolink|Réalisé avec Visual Studio}} |
| | Lecture du **diagramme de classes** : Dracula se** compose** de différents organes dont un estomac. Si Dracula disparaît, son estomac aussi. |
| | |
| | {{ :python:poo:umlestomac.png?nolink |Réalisé avec Visual Studio}} |
| | <code csharp *.cs> |
| | namespace Enfer |
| | { |
| | class Estomac {// On définira ici les particularité de l'estomac} |
| | |
| | class Monstre { |
| | private Estomac estomac; |
| | public Monstre(string lenom, int x = 0, int y = 0, int pv = 100) { |
| | // ... |
| | estomac = new Estomac(); // Chaque monstre possède un estomac |
| | // ... // Si le montre disparaît, l'estomac aussi |
| | } |
| | } |
| | //... |
| | public class Program |
| | public static void Main() { |
| | Monstre dracula = new Monstre("Dracula", 10, 10, 200); |
| | } |
| | } |
| | } |
| | </code> |
| </pane> | </pane> |
| </tabs> | </tabs> |
| |
| <pane id="tab-python_7c"> | <pane id="tab-python_7c"> |
| {{ :python:poo:vampireverre.png?nolink&150|}} | {{ :python:poo:vampireverre.png?nolink&150|Réalisé avec PynSource}} |
| **Lecture du diagramme de classe** : l'objet verreDeSang est passé **provisoirement** à l'objet Dracula à l'aide de sa méthode boit. Contrairement à l'exemple précédent l'objet verreDeSang n'est pas associé à un lien permanent dans la classe Monstre. En effet, Dracula n'aura pas toujours un verre à la main ! | **Lecture du diagramme de classe** : l'objet verreDeSang est passé **provisoirement** à l'objet Dracula à l'aide de sa méthode boit. Contrairement à l'exemple précédent l'objet verreDeSang n'est pas associé à un lien permanent dans la classe Monstre. En effet, Dracula n'aura pas toujours un verre à la main ! |
| {{ :python:poo:pyassociation2.png?nolink |}} | {{ :python:poo:pyassociation2.png?nolink |Réalisé avec PynSource}} |
| |
| <code python exemple3.py> | <code python exemple3.py> |
| |
| <pane id="tab-csharp_7c"> | <pane id="tab-csharp_7c"> |
| {{ :python:poo:vampireverre.png?nolink&150|}} | {{ :python:poo:vampireverre.png?nolink&150|Réalisé avec Visual Studio}} |
| **Lecture du diagramme de classe** : l'objet verreDeSang est passé **provisoirement** à l'objet Dracula à l'aide de sa méthode boit. Contrairement à l'exemple précédent l'objet verreDeSang n'est pas associé à un lien permanent dans la classe Monstre. En effet, Dracula n'aura pas toujours un verre à la main ! | **Lecture du diagramme de classe** : l'objet verreDeSang est passé **provisoirement** à l'objet Dracula à l'aide de sa méthode boit. Contrairement à l'exemple précédent l'objet verreDeSang n'est pas associé à un lien permanent dans la classe Monstre. En effet, Dracula n'aura pas toujours un verre à la main ! |
| {{ :python:poo:VSAssociation2.png?nolink |}} | {{ :python:poo:VSAssociation2.png?nolink |Réalisé avec Visual Studio}} |
| |
| <code csharp exemple3.cs> | <code csharp exemple3.cs> |