Vol. 6 — № 16
The Python Loop · KiosqueNewsstand
Blog  
Un atelier Python · Édition d'ApprentissageA Python Workshop · Learning Edition

La recherche d'attribut : instance, classe, MRO Attribute lookup: instance, class, MRO

obj.x n'est jamais une simple lecture de case mémoire : c'est une recherche, dans un ordre fixe. Python regarde d'abord le __dict__ de l'instance ; s'il n'y trouve rien, il remonte le __dict__ de la classe, puis celui de chaque classe parente, dans l'ordre du MRO. Une liste posée comme attribut de classe est donc partagée par toutes les instances — jusqu'à ce que l'une d'elles écrive enfin la sienne. obj.x is never a plain memory-slot read: it's a search, in a fixed order. Python first looks at the instance's __dict__; finding nothing there, it climbs the class's __dict__, then each parent class's, in MRO order. A list set as a class attribute is therefore shared by every instance — until one of them finally writes its own.

AudienceAudience
Dev qui a vu une liste censée être propre à chaque instance se remplir pour tout le monde à la fois Dev who's watched a list meant to be per-instance fill up for everyone at once
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 18 min ●●●○ AttributsMRO__dict__

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

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.

Même syntaxe, deux étages différentsSame syntax, two different floors
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
Le sous-réflexe du numéroThis issue's sub-reflex

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?

Ce n'est pas un hasard de vocabulaireIt's not a coincidence of vocabulary

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.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Python Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Python Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand