Maxfiy atributlarni metodlar orqali boshqarishni bildik. Ammo hisob.balans_korsatish() o'rniga hisob.balans deb yozsak ancha qulay bo'lar edi. @property dekoratori ana shu imkonni beradi: atributga o'xshab murojaat qilib, aslida metodni chaqirish.
class Talaba:
def __init__(self, ism, yosh):
self.ism = ism
self.__yosh = yosh # yashirilgan
@property
def yosh(self): # getter — o'qish uchun
return self.__yosh
t = Talaba("Ali", 20)
print(t.yosh) # 20 — metod emas, atributday murojaat!t.yosh deb yozsak, Python avtomatik yosh() metodini chaqiradi. Tashqi kod uchun bu oddiy atributday ko'rinadi.
@x.setter — yozish uchun
Faqat o'qish kamlik qilsa, setter qo'shamiz. U qiymat o'rnatishda tekshiruv o'tkazadi:
class Talaba:
def __init__(self, ism, yosh):
self.ism = ism
self.__yosh = yosh
@property
def yosh(self):
return self.__yosh
@yosh.setter
def yosh(self, yangi_yosh): # setter — yozish uchun
if yangi_yosh < 0:
print("Yosh manfiy bo'lishi mumkin emas!")
else:
self.__yosh = yangi_yosh
t = Talaba("Ali", 20)
print(t.yosh) # 20
t.yosh = 21 # setter chaqiriladi
print(t.yosh) # 21
t.yosh = -5 # setter tekshiradi: noto'g'ri!
print(t.yosh) # 21 — o'zgarmaganNatija:
20
21
Yosh manfiy bo'lishi mumkin emas!
21@property va @yosh.setter birgalikda ishlaydi: o'qishda getter, yozishda setter chaqiriladi. Faqat getter yozsangiz va setter yozmasangiz, o'qib bo'ladi, lekin o'zgartirish AttributeError beradi — bu ba'zan kerakli xatti-harakat.
# @property faqat o'qish uchun (setter yo'q)
class Doira:
def __init__(self, radius):
self.__radius = radius
@property
def radius(self):
return self.__radius
@property
def yuza(self): # hisoblangan property
return 3.14 * self.__radius ** 2
d = Doira(5)
print(d.radius) # 5
print(d.yuza) # 78.5
# d.radius = 10 # AttributeError — setter yo'qMuhim qoidalar:
@property metodga atributday murojaat imkonini beradi@x.setter qiymat o'rnatishda tekshiruv o'tkazish imkonini beradi@property inkapsulyatsiyani qulay interfeys bilan birlashtiradiHarorat klassi
Harorat klassini yarating:
__init__(self, daraja) — harorat qiymatini __daraja maxfiy atributida saqlang@property daraja — getter, __daraja qiymatini qaytarsin@daraja.setter — agar yangi qiymat -273 dan kichik bo'lsa "Noto'g'ri harorat!" chiqarsin va o'zgartirmasin, aks holda o'rnatingfarengeyt(self) metodi — Celsius ni Farengeyt ga aylantirsin: daraja * 9/5 + 32Misol:
Kiritish:
0Chiqish:
0.0
32.0