Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
python:poo:poo [2023/07/04 09:36] – [4.1 Association unidirectionnelle] phil | python:poo:poo [2023/07/04 11:24] (Version actuelle) – [1.3 Les méthodes] phil |
---|
| |
<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> |