Ce face property()
Cu decoratorul @property, o metodă se citește ca un atribut, fără paranteze: cerc.aria în loc de cerc.aria(). Cu @nume.setter adaugi codul care rulează la atribuire, de exemplu o validare.
Astfel poți începe cu atribute simple și adăuga mai târziu logică, fără să schimbi codul care folosește clasa. Fără setter, atributul este doar pentru citire.
Parametri
| Parametru | Descriere |
|---|---|
fget, fset, fdel, doc |
Forma ca funcție: metodele de citire, scriere, ștergere și documentația. De obicei se folosește forma cu decorator. |
Ce returnează
Un obiect property.
Exemple
Exemplul 1: Atribut calculat și validare
class Produs:
def __init__(self, nume, pret):
self.nume = nume
self.pret = pret
@property
def pret(self):
return self._pret
@pret.setter
def pret(self, valoare):
if valoare < 0:
raise ValueError("Prețul nu poate fi negativ")
self._pret = valoare
@property
def pret_cu_tva(self):
return round(self.pret * 1.21, 2)
p = Produs("Cafea", 30)
print(p.pret, p.pret_cu_tva)
p.pret = 40
print(p.pret_cu_tva)
try:
p.pret = -5
except ValueError as e:
print("Eroare:", e)
Rezultat
30 36.3
48.4
Eroare: Prețul nu poate fi negativ
Greșeli frecvente
- În setter scrii
self.pret = valoareîn loc deself._pret = valoare. Setter-ul se apelează pe el însuși la infinit și primeștiRecursionError. - Încerci să atribui unei proprietăți fără setter și primești
AttributeError: property ... has no setter.
Comenzi înrudite
class: Definește o clasă: un șablon pentru obiecte care au date (atribute) și comportament (metode).classmethod() și staticmethod(): Metode care primesc clasa în loc de obiect (classmethod) sau nu primesc nici clasa, nici obiectul (staticmethod).functools.cached_property: O proprietate calculată o singură dată per obiect, apoi păstrată ca atribut obișnuit.