Kontrolišite kako se knjiga menja.
Enkapsulacija grupiše podatke sa pravilima koja ih štite. U Pythonu, vodeća donja crta kao _year je konvencija za internu upotrebu, a ne stroga zabrana pristupa.
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.is_available = True
self.year = year
@property
def year(self):
return self._year
@year.setter
def year(self, value):
if not isinstance(value, int) or value <= 0:
raise ValueError("year must be a positive integer")
self._year = value
def borrow(self):
self.is_available = False
def return_book(self):
self.is_available = True
book = Book("Dune", "Frank Herbert", 1965)
try:
book.year = 0
except ValueError:
pass
print(book.year)self.year = year poziva setter pri kreiranju, pa validacija štiti i početnu vrednost. Setter proverava vrednost pre dodele self._year.
1965Neuspešna dodela podiže ValueError pre promene _year. Nakon hvatanja greške, ranija ispravna godina ostaje 1965.
Obrazac svojstva: Čitajte book.year kroz getter. Dodelite book.year = value kroz setter. Zadržite _year kao internu sačuvanu vrednost.
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.is_available = True
self.year = year
@property
def year(self):
return self._year
@year.setter
def year(self, value):
if not isinstance(value, int) or value <= 0:
raise ValueError("year must be a positive integer")
self._year = value
def borrow(self):
self.is_available = False
def return_book(self):
self.is_available = True
book = Book("Dune", "Frank Herbert", 1965)
try:
book.year = 0
except ValueError:
pass
print(book.year)Javno svojstvo year je jednostavno za korišćenje, dok njegov setter odbija nultu, negativnu ili necelobrojnu godinu.
@year.setter
def year(self, value):
if not isinstance(value, int) or value <= 0:
raise ValueError("year must be a positive integer")
self._year = valuePrvo validirajte, a zatim dodelite. Taj redosled znači da neispravan unos ne može prepisati ispravnu sačuvanu vrednost.
Pratite zaštićeno ažuriranje
- 1. Koristite javno svojstvobook.year = 1965 poziva setter umesto direktnog upisivanja u _year.
- 2. Validirajte novu vrednostSetter prihvata samo pozitivne cele brojeve, a u suprotnom podiže ValueError.
- 3. Sačuvajte nakon validacijeSamo ispravna vrednost stiže do self._year.
- 4. Sačuvajte ranije stanjeNeuspešna dodela ostavlja prethodno ispravnu godinu knjige nepromenjenom.
Česte greške
- Pisanje self.year unutar setteraKoristite self._year u setteru; dodela self.year tamo ponovo poziva setter.
- Dodela pre validacijeProverite vrednost pre promene _year kako neispravno stanje nikada ne bi bilo sačuvano.
- Tretiranje _year kao strogo privatnogDonja crta je konvencija koja označava internu upotrebu; Python ne blokira direktan pristup.
- Zaboravljanje validacije u __init__Dodelite self.year = year u __init__ kako bi kreiranje koristilo isto pravilo settera.
