Le Laboratoire Virtuel & Terminal Pratique est en ligne :

Ouvrir le Labo
Volume 3 : Manuel Complet de Python — Syntaxe Moderne, POO & Algorithmes/Module 2 : POO Avancée, Dunder Methods & Architecture

Programmation Orientée Objet : Encapsulation, @property & Dunder

Labo Virtuel >_

Programmation Orientée Objet Avancée & Méthodes Spéciales



Tiré des Parties IV et V du Manuel Complet de Python, ce chapitre décortique l'ingénierie orientée objet en Python : encapsulation des états sensibles, validation de données par accesseurs et surcharge d'opérateurs via les méthodes dunder (double underscore).

---

1. Encapsulation & Propriétés Décorées (@property)



En Python, la convention veut qu'un attribut préfixé par un trait de soulignement simple _nom soit considéré comme privé par convention, tandis qu'un double soulignement __nom active le name mangling (renommage interne par l'interpréteur pour éviter les collisions d'héritage).

Le décorateur @property permet de définir des accesseurs (getters) et des mutateurs (setters) élégants avec validation automatique :

``python class CibleAudit: def __init__(self, ip: str, port: int): self.ip = ip self.port = port # Déclenche automatiquement le setter de validation

@property def port(self) -> int: """Getter de lecture du port.""" return self._port

@port.setter def port(self, valeur: int) -> None: """Setter avec validation rigoureuse des plages réseau valides.""" if not isinstance(valeur, int): raise TypeError("Le port réseau doit être un entier.") if not (1 <= valeur <= 65535): raise ValueError(f"Port invalide : {valeur}. La plage autorisée est 1..65535.") self._port = valeur

def est_port_privilegie(self) -> bool: """Retourne True si le port est < 1024 (réservé aux services root sous Linux).""" return self._port < 1024
`

---

2. Les Méthodes Spéciales Dunder (__repr__, __str__, __eq__, __hash__)



Les méthodes dunder permettent d'intégrer vos propres classes au comportement natif du langage Python :

`python class HoteReseau: def __init__(self, ip: str, mac: str): self.ip = ip self.mac = mac.upper()

def __repr__(self) -> str: """Représentation formelle non ambiguë destinée aux développeurs et logs.""" return f"HoteReseau(ip={self.ip!r}, mac={self.mac!r})"

def __str__(self) -> str: """Représentation lisible destinée à l'utilisateur final.""" return f"{self.ip} [{self.mac}]"

def __eq__(self, other: object) -> bool: """Deux hôtes réseau sont considérés identiques si leur adresse MAC physique est identique.""" if not isinstance(other, HoteReseau): return NotImplemented return self.mac == other.mac

def __hash__(self) -> int: """Permet d'utiliser l'objet comme clé de dictionnaire ou dans un ensemble (set).""" return hash(self.mac)
`

---

3. Gestionnaire de Contexte Personnalisé (__enter__ et __exit__)



Le protocole de gestionnaire de contexte permet d'utiliser l'instruction
with pour garantir la libération des ressources (fermeture de sockets, libération de verrous) même en cas d'exception non gérée :

`python import socket

class SocketAuditSecurise: def __init__(self, hote: str, port: int, timeout: float = 1.0): self.hote = hote self.port = port self.timeout = timeout self.sock: socket.socket | None = None

def __enter__(self) -> socket.socket: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(self.timeout) self.sock.connect((self.hote, self.port)) return self.sock

def __exit__(self, exc_type, exc_val, exc_tb) -> bool: if self.sock: self.sock.close() # Retourne False pour laisser propager l'exception si une erreur est survenue return False
``
Informations
Formatarticle
Durée50 min
StatutEn cours
Laboratoire Virtuel Pratique

Pratiquez cette le?on dans le Terminal Linux et l'ex?cuteur WebAssembly Python en direct.

Ouvrir dans le Labo >_