class Vehicule: def __init__(self, marque, vitesse_max): self.marque = marque # attribut d'instance self.vitesse_max = vitesse_max self.vitesse_actuelle = 0 def accelerer(self, delta): self.vitesse_actuelle = min(self.vitesse_actuelle + delta, self.vitesse_max)voiture = Vehicule("Renault", 180) # creation d'une instancevoiture.accelerer(50)print(voiture.vitesse_actuelle) # 50class Vehicule: nombre_total = 0 # attribut de CLASSE : partage par tous les vehicules def __init__(self, marque): self.marque = marque # attribut d'INSTANCE : propre a cet objet Vehicule.nombre_total += 1 # incremente le compteur partagev1 = Vehicule("Renault")v2 = Vehicule("Peugeot")print(Vehicule.nombre_total) # 2class Voiture(Vehicule): # Voiture herite de Vehicule def klaxonner(self): print("Tut tut !")ma_voiture = Voiture("Renault", 180)ma_voiture.accelerer(30) # methode heritee de Vehiculema_voiture.klaxonner() # methode propre a Voitureclass Voiture(Vehicule): def __init__(self, marque, vitesse_max, nb_portes): super().__init__(marque, vitesse_max) # appelle __init__ du parent self.nb_portes = nb_portes # ajoute son propre attributma_voiture = Voiture("Renault", 180, 5)class CompteBancaire: def __init__(self, solde_initial): self._solde = solde_initial # underscore = usage interne par convention def deposer(self, montant): self._solde += montantcompte = CompteBancaire(100)compte.deposer(50)compte._solde # techniquement accessible, mais deconseilleclass CompteBancaire: def __init__(self, solde_initial): self._solde = solde_initial @property def solde(self): # lecture : compte.solde (sans parentheses) return self._solde @solde.setter def solde(self, valeur): # ecriture : compte.solde = 200 if valeur < 0: raise ValueError("Le solde ne peut pas etre negatif") self._solde = valeurcompte = CompteBancaire(100)compte.solde = 200 # passe par le setter, qui valide la valeurclass Vehicule: def __init__(self, marque): self.marque = marque def __str__(self): # appelee automatiquement par print() return f"Vehicule({self.marque})" def __eq__(self, autre): # appelee automatiquement par == return self.marque == autre.marquev = Vehicule("Renault")print(v) # Vehicule(Renault) : utilise __str__v == Vehicule("Renault") # True : utilise __eq__class Voiture(Vehicule): def deplacer(self): print("Roule sur la route")class Bateau(Vehicule): def deplacer(self): print("Navigue sur l'eau")for v in [Voiture("Renault"), Bateau("Zodiac")]: v.deplacer() # chaque objet execute SA propre version de deplacer()class Vehicule: def __init__(self, marque, vitesse_max): self.marque = marque self.vitesse_max = vitesse_max @staticmethod def kmh_vers_ms(vitesse_kmh): # ne depend d'aucune instance : simple fonction utilitaire return vitesse_kmh / 3.6 @classmethod def voiture_standard(cls): # constructeur alternatif : cree un Vehicule avec des valeurs par defaut return cls("Generique", 130)Vehicule.kmh_vers_ms(90) # 25.0 (pas besoin d'instance)v = Vehicule.voiture_standard() # utilise le constructeur alternatiffrom dataclasses import dataclass@dataclassclass Point: x: int y: intp1 = Point(1, 2)print(p1) # Point(x=1, y=2) : __repr__ genere automatiquementp1 == Point(1, 2) # True : __eq__ genere automatiquement@dataclassclass Point: x: int = 0 y: int = 0origine = Point() # Point(x=0, y=0)p = Point(x=5) # Point(x=5, y=0)