3.2 Attributs et Méthodes : Aller plus loin
Une classe peut posséder des variables partagées par tous (Attributs de classe) ou spécifiques à chacun (Attributs d'instance).
1. Variables de classe vs Instance
class Robot:
origine = "Usine Matrix" # Partagé par TOUS les robots
def __init__(self, modele):
self.modele = modele # Spécifique à CE robot
r1 = Robot("T-800")
r2 = Robot("R2D2")
print(r1.origine) # Usine Matrix
print(r2.origine) # Usine Matrix
2. Méthodes spéciales : __str__ et __repr__
Comment afficher proprement un objet ? Par défaut, Python affiche une adresse mémoire illisible. Les "Dunder Methods" (Double Underscore) permettent de personnaliser cela.
class Composant:
def __init__(self, nom, version):
self.nom = nom
self.version = version
def __str__(self):
# Pour l'utilisateur final (print)
return f"{self.nom} (v{self.version})"
def __repr__(self):
# Pour le débogage : non-ambigu, idéalement reproductible
return f"Composant(nom='{self.nom}', version='{self.version}')"
lib = Composant("requests", "2.28.1")
print(lib) # requests (v2.28.1)
print(repr(lib)) # Composant(nom='requests', version='2.28.1')
__repr__ est affichĂ© automatiquement dans le shell interactif et dans les logs â pratique pour dĂ©boguer sans perdre d'information.
En php, l'équivalent de __str__ : __toString()
3. Comparer des objets : __eq__
Par défaut, == compare les identités mémoire (comme === sur les objets en PHP). __eq__ permet de définir ce que signifie "égal" pour ta classe.
class Composant:
def __init__(self, nom, version):
self.nom = nom
self.version = version
def __eq__(self, other):
return self.nom == other.nom and self.version == other.version
a = Composant("requests", "2.28.1")
b = Composant("requests", "2.28.1")
c = Composant("flask", "3.0.0")
print(a == b) # True â mĂȘme nom et version
print(a == c) # False
Sans __eq__, a == b aurait retourné False car ce sont deux objets distincts en mémoire.
4. Méthodes statiques (@staticmethod)
Parfois, une classe a besoin d'une fonction utilitaire qui n'utilise ni self ni cls. C'est l'équivalent des méthodes statiques en PHP.
class Tools:
@staticmethod
def clean_name(name):
return name.strip().lower()
print(Tools.clean_name(" PyThon ")) # python