functools.cached_property în Python

Modulul functools Python 3.8+

O proprietate calculată o singură dată per obiect, apoi păstrată ca atribut obișnuit.

Sintaxă
@functools.cached_property
def atribut(self): ...

Ce face functools.cached_property

@cached_property se comportă ca @property la prima citire: rulează metoda. Rezultatul este apoi salvat în obiect, iar citirile următoare îl returnează direct, fără recalculare.

Este potrivită pentru valori costisitoare care nu se schimbă după crearea obiectului. Valoarea memorată poate fi ștearsă cu del obiect.atribut, ca să fie recalculată la următoarea citire.

Parametri

Parametru Descriere
func Metoda care calculează valoarea.

Ce returnează

Un descriptor cached_property.

Exemple

Exemplul 1: Calcul făcut o singură dată

from functools import cached_property

class Raport:
    def __init__(self, vanzari):
        self.vanzari = vanzari

    @cached_property
    def total(self):
        print("  (calculez totalul)")
        return sum(self.vanzari)

r = Raport([120, 80, 300])
print(r.total)
print(r.total)
r.vanzari.append(100)
print(r.total)
del r.total
print(r.total)

Rezultat

  (calculez totalul)
500
500
500
  (calculez totalul)
600

Greșeli frecvente

  • Folosești cached_property pentru o valoare care depinde de atribute modificabile. După modificare, valoarea memorată rămâne veche până o ștergi.

Comenzi înrudite

  • property(): Transformă o metodă într-un atribut calculat, cu verificare la citire și la scriere.
  • functools.lru_cache() și functools.cache(): Memorează rezultatele unei funcții, ca apelurile repetate cu aceleași argumente să fie instantanee.
  • class: Definește o clasă: un șablon pentru obiecte care au date (atribute) și comportament (metode).