Le Vol. V résolvait un nom libre dans le temps. Ce volume résout un attribut dans l'espace : où vit-il ?Vol. V resolved a free name in time. This volume resolves an attribute in space: where does it live?
LEGB (numéros 13 à 15) répondait à une question précise : où chercher un nom qui n'appartient à aucun objet — une variable ordinaire, lue dans une fonction. Mais obj.x pose une question voisine, jamais couverte jusqu'ici : où chercher un attribut qui appartient, lui, à un objet précis ? La réponse est une seconde recherche à étages, tout aussi mécanique que LEGB, mais qui parcourt un axe différent : d'abord le dictionnaire de l'instance elle-même, puis celui de sa classe. j.nom et j.vie empruntent le même point d'entrée — la syntaxe obj.attribut — et pourtant ne vivent pas au même étage.LEGB (issues 13 through 15) answered a precise question: where to look for a name that belongs to no object — an ordinary variable, read inside a function. But obj.x asks a neighboring question, never covered so far: where to look for an attribute that belongs, specifically, to one object? The answer is a second tiered search, just as mechanical as LEGB, but walking a different axis: first the instance's own dictionary, then its class's. j.nom and j.vie go through the same entry point — the obj.attribute syntax — and yet don't live on the same floor.
class Joueur: vie = 100 # attribut de CLASSE def __init__(self, nom): self.nom = nom # attribut d'INSTANCE j = Joueur("Aria") print(j.nom) # "Aria" -- trouvé dans j.__dict__ print(j.vie) # 100 -- absent de j.__dict__, trouvé dans Joueur.__dict__ print(j.__dict__) # {'nom': 'Aria'} -- "vie" n'y est PAS print(Joueur.__dict__['vie']) # 100 -- c'est LÀ qu'il vit vraiment
Face à un obj.attribut, demande : cet attribut vit-il dans le __dict__ de cette instance précise, ou seulement dans celui de sa classe — partagé, donc, par toutes les autres instances ?Facing an obj.attribute, ask: does this attribute live in this specific instance's __dict__, or only in its class's — shared, then, by every other instance?
LEGB et la recherche d'attribut partagent la même logique : chercher d'abord au plus près, remonter par étages fixes si rien n'est trouvé, s'arrêter à la première correspondance. LEGB remonte des portées de fonctions ; la recherche d'attribut remonte une chaîne d'héritage — le MRO, sujet du chapitre 3.LEGB and attribute lookup share the same logic: look closest first, climb through fixed tiers if nothing is found, stop at the first match. LEGB climbs function scopes; attribute lookup climbs an inheritance chain — the MRO, the subject of chapter 3.