Exercices Architecture & Patterns Délégation avec __gétattr__
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Délégation avec __gétattr__

En Python, quand tu accedes a un attribut qui n'existe pas sur un objet, Python appelle la méthode speciale __gétattr__. C'est un filet de sécurité : si l'attribut n'est pas trouve normalement, cette méthode est appelee en dernier recours.

Ca permet de deleguer transparentement a un objet interne. C'est le pattern Proxy : l'objet exterieur se comporte comme l'objet interne, avec des fonctionnalités en plus.

class Proxy:
def __init__(self, cible):
self._cible = cible

def __getattr__(self, name):
return gétattr(self._cible, name)

p = Proxy([1, 2, 3])
p.append(4) # delegue a la liste interne

Attention : __gétattr__ n'est appele QUE quand l'attribut n'est pas trouve normalement. Les méthodes definies sur ta classe sont toujours prioritaires.

Crée une classe Cache qui enveloppe une liste en ajoutant un cache de résultats :
- Cache(liste) stocke la liste interne
- max_cache() retourne le max et le met en cache (dans self._cache['max'])
- min_cache() retourne le min et le met en cache
- invalider() vide le cache
- __gétattr__ delegue les attributs inconnus a la liste interne

Exemple :
c = Cache([3, 1, 4, 1, 5])
c.max_cache() # 5 (calcule et met en cache)
c.max_cache() # 5 (retourne le cache)
c.append(6) # delegue a la liste interne via __gétattr__

Tests (3/4)

max_cache
c = Cache([3, 1, 4, 1, 5])
assert c.max_cache() == 5
min_cache
c = Cache([3, 1, 4, 1, 5])
assert c.min_cache() == 1
Délégation append
c = Cache([1, 2, 3])
c.append(4)
assert c._liste[-1] == 4

+ 0 tests cachés

Indices (3 disponibles)

solution.py