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
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 >_