Bu darsda inkapsulyatsiya bo'yicha barcha bilimlarni birlashtiramiz: maxfiy atributlar, @property getter, va validatsiyali metodlar. Vazifa — haqiqiy bank hisobi kabi ishlaydigan klass yaratish.
Real bank hisobida quyidagi qoidalar bor:
class BankHisobi:
def __init__(self, boshlangich_balans):
self.__balans = boshlangich_balans # maxfiy atribut
@property
def balans(self): # faqat o'qish — setter yo'q
return self.__balans
def pul_qosh(self, miqdor):
if miqdor > 0:
self.__balans += miqdor
else:
print("Noto'g'ri miqdor!")
def pul_ol(self, miqdor):
if miqdor > 0 and self.__balans >= miqdor:
self.__balans -= miqdor
else:
print("Mablag' yetarli emas!")
def __str__(self):
return f"Balans: {self.__balans} so'm"
hisob = BankHisobi(1000)
hisob.pul_qosh(500)
print(hisob) # Balans: 1500 so'm
hisob.pul_ol(300)
print(hisob) # Balans: 1200 so'm
hisob.pul_ol(5000) # Mablag' yetarli emas!
print(hisob) # Balans: 1200 so'm
print(hisob.balans) # 1200 — @property orqali o'qish
# hisob.balans = 9999 # AttributeError — setter yo'q!Natija:
Balans: 1500 so'm
Balans: 1200 so'm
Mablag' yetarli emas!
Balans: 1200 so'm
1200Bu klassda inkapsulyatsiyaning barcha xususiyatlari birlashgan:
__balans — tashqaridan ko'rinmaydi, bevosita o'zgartirib bo'lmaydi@property balans — faqat o'qish (getter bor, setter yo'q)pul_qosh() va pul_ol() — o'zgartirish faqat tekshiruvdan keyinMuhim qoidalar:
@property — atributni faqat o'qib bo'ladi, yozib bo'lmaydi__str__ — obyektni chiroyli ko'rsatish uchunBank hisobi tizimi
BankHisobi klassini to'liq inkapsulyatsiya bilan yarating:
__init__(self, boshlangich) — __balans ni boshlang'ich qiymat bilan boshlang@property balans — faqat getter (setter yo'q), __balans ni qaytarsinpul_qosh(self, miqdor) — agar miqdor > 0 bo'lsa qo'shing, aks holda "Noto'g'ri miqdor!" chiqaringpul_ol(self, miqdor) — agar miqdor > 0 va balans >= miqdor bo'lsa oling, aks holda "Mablag' yetarli emas!" chiqaring__str__ — "Balans: {balans} so'm" formatida qaytarsin