Skip to article frontmatterSkip to article content

accès aux attributs - troisième et dernier notebook
aka putting it all together:
où on essaye de réconcilier toutes ces façons d’accéder aux attributs: properties, __getattr__, et autres descriptors

la mécanique générale:

accès en écriture: __setattr__

par rapport à la version simpliste qu’on a vue dans les premiers chapitres, il y a peu de différence concernant les accès en écriture
on écrit toujours directement dans l’objet

il existe toutefois un hook: on invoque si elle existe la dunder __setattr__

accès en lecture: __getattribute__

avertissement

class WithGetAttr:

    # seulement pour les attributs
    # non trouvés
    def __getattr__(self, attrname):
        print("getattr with name {}".format(attrname))
        return 10

gwa = WithGetAttr()
gwa.x
getattr with name x
10
# ce qui n'empêche pas d'avoir aussi des attributs "normaux"
gwa.y = 20
print(gwa.y)
20
# vous pouvez toujours écrire ce 
# que vous voulez dans __dict__ 
# ou autre, avec ce code
# un attribut d'instance
# renvoie toujours 100

class WithGetAttribute:

    # le point d'entrée pour la recherche
    def __getattribute__(self, attrname):
        return 100

    # comme notre __getattribute__
    # n'implémente pas la recherche
    # des défauts via __getattr__,
    # cette méthode en réalité
    # est inutile ici
    def __getattr__(self, attrname):
        print("ne passera jamais par ici")

    # inutile d'essayer d'implémenter un
    # descriptor ou une property...
    # en exercice ..

wgu = WithGetAttribute()
wgu.foo
100
# pas la peine d'essayer
wgu.bar = 100
wgu.bar
100

ça va très loin

# même __dict__ !
wgu.__dict__
100

subtilité de __getattribute__

accès en écriture

écriture

class WithSetAttr:

    def __setattr__(self, attrname, value):
        print("setting {} to {}".format(attrname, value))
        # appeler la façon par défaut
        # de remplir un attribut
        object.__setattr__(self, attrname, value)

wsa = WithSetAttr()
wsa.name = 'john'
wsa.name
setting name to john
'john'

conclusion

lecture

écriture

exercice

exercice

pour en savoir plus