UML

Introduction à UML
Author

Ludovic Deneuville

1 Diagramme

classDiagram
    class Courrier {
        <<Abstract>>
        +poids: float
        +expedition_rapide: bool
        +destination: str

        +__str__(): str
        +complement_str()*: str
        +calcul_affranchissement()*: float
    }

    class Colis {
        +volume: float
        +complement_str(): str
        +calcul_affranchissement(): float
    }

    class Lettre {
        +format: str
        +complement_str(): str
        +calcul_affranchissement(): float
    }

    Courrier <|-- Colis
    Courrier <|-- Lettre

2 Code

courrier.py
from abc import ABC, abstractmethod

class Courrier(ABC):
    """Définition d'un article
    """

    def __init__(self, poids, expedition_rapide, adresse_destination):
        """Constructeur

        Parameters
        ----------
        poids : float
            Poids en kilogramme
        expedition_rapide : bool
            True si mode d'expédition rapide
        adresse_destination : str
            Adresse de destination
        """
        self.poids = poids
        self.expedition_rapide = expedition_rapide
        self.adresse_destination = adresse_destination

    @abstractmethod
    def calcul_affranchissement(self):
        pass

    def __str__(self):
        """Affichage d'un courrier"""
        return f"""
            Colis :
            Adresse destination : {self.adresse_destination}
            Poids : {self.poids} grammes
            Mode : {self.expedition_rapide}
            {self.complement_str()}
            Prix du timbre : {self.calcul_affranchissement()}€"""

    @abstractmethod
    def complement_str(self):
        pass
lettre.py
from courrier import Courrier

class Lettre(Courrier):
    """Définition d'une lettre"""

    def __init__(self, poids, expedition_rapide, adresse_destination, format):
        """
        Parameters
        ----------
        format : str
            Format de la lettre (A3 ou A4)
        """
        super().__init__(poids, expedition_rapide, adresse_destination)
        self.format = format

    def complement_str(self) -> str:
        return "Format : {}".format(self.format)

    def calcul_affranchissement(self) -> float:
        """Calcule l'affranchissement

        Returns
        --------
        float
           prix du timbre
        """
        tarif = 0
        if self.format == "A4":
            tarif = 2.5 + self.poids * 0.001
        else:
            tarif = 3.5 + self.poids * 0.001

        if self.expedition_rapide:
            tarif *= 2

        return tarif
colis.py
from courrier import Courrier

class Colis(Courrier):
    """Définition d'un colis
    """

    def __init__(self, poids, expedition_rapide, adresse_destination, volume):
        """
        Parameters
        ----------
        volume : float
            Volume en litres
        """
        super().__init__(poids, expedition_rapide, adresse_destination)
        self.volume = volume

    def complement_str(self) -> str:
        return f"Volume : {self.volume} litres"

    def calcul_affranchissement(self):
        """Calcule l'affranchissement

        Returns
        --------
        float
           prix du timbre
        """
        tarif = self.volume / 4 + self.poids * 0.001
        if self.expedition_rapide:
            tarif *= 2
        return tarif
sandbox.py
from colis import Colis
from lettre import Lettre

l1 = Lettre(80, "normal", "Bordeaux", "A4")
print(l1)

c1 = Colis(3500, "rapide", "Rennes", 2.25)
print(c1)