Oldingi darsda inkapsulyatsiya nima ekanligini bildik. Endi uni Pythonda qanday amalga oshirishni ko'ramiz. Pythonda atributlarni yashirish uchun ikki usul bor.
Birinchi usul: bitta pastki chiziq _
_balans — bu "iltimos, to'g'ridan-to'g'ri o'zgartirmang" degan kelishuv (konventsiya). Texnik jihatdan tashqaridan kirish mumkin, lekin dasturchilar bu belgini ko'rsa, bu atributni bevosita ishlatmaydi.
class BankHisobi:
def __init__(self, balans):
self._balans = balans # yumshoq maxfiy (soft private)
hisob = BankHisobi(1000)
print(hisob._balans) # ishlaydi, lekin yaxshi amaliyot emasIkkinchi usul: ikki pastki chiziq __
__balans — kuchli maxfiy (strong private). Python bu nom bilan atributni o'zgartirib saqlaydi (_ClassName__balans), shuning uchun tashqaridan oddiy nom bilan kirish imkonsiz bo'ladi. Bu nom mangling deb ataladi.
class BankHisobi:
def __init__(self, balans):
self.__balans = balans # kuchli maxfiy
def balans_korsatish(self):
return self.__balans
def pul_qoshish(self, miqdor):
if miqdor > 0:
self.__balans += miqdor
def pul_olish(self, miqdor):
if 0 < miqdor <= self.__balans:
self.__balans -= miqdor
else:
print("Mablag' yetarli emas!")
hisob = BankHisobi(1000)
hisob.pul_qoshish(500)
print(hisob.balans_korsatish()) # 1500
hisob.pul_olish(200)
print(hisob.balans_korsatish()) # 1300
# hisob.__balans = -99999 # asl __balansni o'zgartirmaydi!Natija:
1500
1300Python __balans nomini ichki tarzda _BankHisobi__balans ga o'zgartiradi (nom mangling). Shuning uchun tashqarida hisob.__balans = -99999 deb yozish asl balansni o'zgartirmaydi — bu butunlay yangi, alohida atribut yaratadi. Haqiqiy balansni faqat pul_qoshish() va pul_olish() metodlari orqali o'zgartirish mumkin, va ular tekshiruv o'tkazadi.
Ikki usulni solishtirish:
| Usul | Belgisi | Ma'no |
|---|---|---|
| Ochiq | balans | Hamma o'zgartira oladi |
| Yumshoq maxfiy | _balans | Kelishuv — o'zgartirmang |
| Kuchli maxfiy | __balans | Nom mangling — _Klass__balans ga o'zgaradi |
Muhim qoidalar:
_atribut — konventsiya, texnik taqiq yo'q__atribut — nom mangling: tashqaridan obj.__atribut asl atributga tegmaydi__atribut to'g'ridan-to'g'ri ishlatiladi (self orqali)Parol klassi
Parol klassini yarating:
__init__(self, parol) — parol qiymatini __parol maxfiy atributida saqlangtekshir(self, kiritilgan) metodi — kiritilgan __parol ga teng bo'lsa True, aks holda False qaytarsinMisol:
Kiritish:
1234
1234Chiqish:
True