Assalomu alaykum, yosh dasturchilar! ๐
Bugun biz OOP'ning muhim prinsiplaridan biri - Encapsulation'ni o'rganamiz
Encapsulation - bu class'ning ichki ma'lumotlarini tashqi dunyodan yashirish va faqat ruxsat etilgan usullar orqali ularga kirish imkonini berish.
๐ก Real hayotdan misol:
Agar sizda bank hisobingiz bo'lsa, siz balansingizni to'g'ridan-to'g'ri o'zgartira olmaysiz. Siz faqat bank orqali pul qo'shish yoki olish mumkin. Bank sizning balansingizni himoya qiladi va faqat ruxsat etilgan operatsiyalarni amalga oshiradi.
class BankHisob:
def __init__(self, ism, dastlabki_summa=0):
self.ism = ism
self.__balans = dastlabki_summa # Private attribute
self.__parol = "1234" # Private attribute
def pul_qo_shish(self, miqdor, parol):
if parol == self.__parol:
self.__balans += miqdor
print(f"{miqdor} so'm qo'shildi. Yangi balans: {self.__balans}")
else:
print("Noto'g'ri parol!")
def pul_olish(self, miqdor, parol):
if parol == self.__parol:
if self.__balans >= miqdor:
self.__balans -= miqdor
print(f"{miqdor} so'm olindi. Yangi balans: {self.__balans}")
else:
print("Yetarli mablag' yo'q!")
else:
print("Noto'g'ri parol!")
Ma'lumotlarni himoya qilish
Noto'g'ri foydalanishdan himoya qilish
Ichki tuzilishni o'zgartirish imkonini berish
Ma'lumotlar va metodlarni tartibli saqlash
class Talaba:
def __init__(self, ism, yosh, kurs):
# Public attributes
self.ism = ism
self.yosh = yosh
self.kurs = kurs
# Private attributes
self.__ball = 0
self.__parol = "talaba123"
self.__max_ball = 100
# Public methods
def ma_lumot_ko_rsatish(self):
print(f"=== {self.ism} ma'lumotlari ===")
print(f"Yosh: {self.yosh}")
print(f"Kurs: {self.kurs}")
print(f"Ball: {self.__ball}")
def ball_qo_shish(self, miqdor, parol):
if parol == self.__parol:
if self.__ball + miqdor <= self.__max_ball:
self.__ball += miqdor
print(f"{miqdor} ball qo'shildi. Jami: {self.__ball}")
Getter - private attribute'ni o'qish uchun
Setter - private attribute'ni o'zgartirish uchun
class Mashina:
def __init__(self, marka, model, yil):
self.marka = marka
self.model = model
self.yil = yil
self.__tezlik = 0
self.__yoqilg_i = 50
self.__yoniq = False
# Getter metodlar
def get_tezlik(self):
return self.__tezlik
def get_yoqilg_i(self):
return self.__yoqilg_i
def get_yoniq(self):
return self.__yoniq
# Setter metodlar
def set_tezlik(self, yangi_tezlik):
if 0 <= yangi_tezlik <= 200:
self.__tezlik = yangi_tezlik
print(f"Tezlik {yangi_tezlik} km/h ga o'zgartirildi")
else:
print("Tezlik 0-200 km/h orasida bo'lishi kerak!")
def set_yoqilg_i(self, yangi_yoqilg_i):
if 0 <= yangi_yoqilg_i <= 100:
self.__yoqilg_i = yangi_yoqilg_i
print(f"Yoqilg'i {yangi_yoqilg_i}% ga o'zgartirildi")
else:
print("Yoqilg'i 0-100% orasida bo'lishi kerak!")
def set_yoniq(self, holat):
if isinstance(holat, bool):
self.__yoniq = holat
if holat:
print("Mashina yoqildi!")
else:
print("Mashina o'chirildi!")
else:
print("Holat True yoki False bo'lishi kerak!")
# Boshqa metodlar
def harakatlanish(self):
if self.__yoniq and self.__yoqilg_i > 0:
self.__tezlik = min(self.__tezlik + 10, 120)
self.__yoqilg_i -= 1
print(f"Mashina harakatlanmoqda. Tezlik: {self.__tezlik} km/h")
else:
print("Mashina yoqilmagan yoki yoqilg'i yo'q!")
Property decorator - getter va setter'ni oddiy attribute kabi ishlatish imkonini beradi.
class Talaba:
def __init__(self, ism, yosh):
self.ism = ism
self._yosh = yosh # Protected attribute
self.__ball = 0 # Private attribute
@property
def yosh(self):
return self._yosh
@yosh.setter
def yosh(self, yangi_yosh):
if 16 <= yangi_yosh <= 25:
self._yosh = yangi_yosh
print(f"Yosh {yangi_yosh} ga o'zgartirildi")
else:
print("Yosh 16-25 orasida bo'lishi kerak!")
@property
def ball(self):
return self.__ball
@ball.setter
def ball(self, yangi_ball):
if 0 <= yangi_ball <= 100:
self.__ball = yangi_ball
print(f"Ball {yangi_ball} ga o'zgartirildi")
else:
print("Ball 0-100 orasida bo'lishi kerak!")
@property
def baho(self):
if self.__ball >= 90:
return "A'lo"
elif self.__ball >= 80:
return "Yaxshi"
elif self.__ball >= 70:
return "Qoniqarli"
else:
return "Qoniqarsiz"
def ma_lumot_ko_rsatish(self):
print(f"=== {self.ism} ma'lumotlari ===")
print(f"Yosh: {self.yosh}")
print(f"Ball: {self.ball}")
print(f"Baho: {self.baho}")
# Test qilish
talaba = Talaba("Ali", 18)
talaba.ma_lumot_ko_rsatish()
# Property'lar oddiy attribute kabi ishlatiladi
talaba.yosh = 19 # Setter ishlaydi
talaba.ball = 85 # Setter ishlaydi
print(f"Yosh: {talaba.yosh}") # Getter ishlaydi
print(f"Ball: {talaba.ball}") # Getter ishlaydi
print(f"Baho: {talaba.baho}") # Getter ishlaydi
class BankHisob:
def __init__(self, ism, dastlabki_summa=0):
self.ism = ism
self._balans = dastlabki_summa
self._parol = "1234"
self._max_kunlik_chiqim = 1000000
self._kunlik_chiqim = 0
self._harakatlar = []
@property
def balans(self):
return self._balans
@balans.setter
def balans(self, yangi_balans):
if yangi_balans >= 0:
self._balans = yangi_balans
else:
print("Balans manfiy bo'lishi mumkin emas!")
@property
def kunlik_chiqim(self):
return self._kunlik_chiqim
def parol_tekshirish(self, parol):
return parol == self._parol
def pul_qo_shish(self, miqdor, parol):
if self.parol_tekshirish(parol):
if miqdor > 0:
self._balans += miqdor
self._harakatlar.append(f"+{miqdor} so'm")
print(f"{miqdor} so'm qo'shildi. Yangi balans: {self._balans}")
else:
print("Miqdor musbat bo'lishi kerak!")
else:
print("Noto'g'ri parol!")
def pul_olish(self, miqdor, parol):
if self.parol_tekshirish(parol):
if miqdor > 0:
if self._balans >= miqdor:
if self._kunlik_chiqim + miqdor <= self._max_kunlik_chiqim:
self._balans -= miqdor
self._kunlik_chiqim += miqdor
self._harakatlar.append(f"-{miqdor} so'm")
print(f"{miqdor} so'm olindi. Yangi balans: {self._balans}")
else:
print("Kunlik chiqim limiti oshib ketdi!")
else:
print("Yetarli mablag' yo'q!")
else:
print("Miqdor musbat bo'lishi kerak!")
else:
print("Noto'g'ri parol!")
def harakatlarni_ko_rsatish(self, parol):
if self.parol_tekshirish(parol):
print("=== So'nggi harakatlar ===")
for harakat in self._harakatlar[-5:]:
print(harakat)
else:
print("Noto'g'ri parol!")
def ma_lumot_ko_rsatish(self, parol):
if self.parol_tekshirish(parol):
print(f"=== {self.ism} bank hisobi ===")
print(f"Balans: {self._balans} so'm")
print(f"Kunlik chiqim: {self._kunlik_chiqim} so'm")
print(f"Kunlik limit: {self._max_kunlik_chiqim} so'm")
else:
print("Noto'g'ri parol!")
# Test qilish
hisob = BankHisob("Ali", 100000)
hisob.ma_lumot_ko_rsatish("1234")
hisob.pul_qo_shish(50000, "1234")
hisob.pul_olish(30000, "1234")
hisob.pul_olish(20000, "1234")
hisob.harakatlarni_ko_rsatish("1234")
hisob.ma_lumot_ko_rsatish("1234")
Vaqt: 10 daqiqa โฐ
Ma'lumotlarni himoya qilish
__ bilan boshlanadi, faqat class ichidan kirish
Ma'lumotlarni xavfsiz boshqarish
Getter/setter'ni oddiy attribute kabi ishlatish
Keyingi dars: Special Methods (Magic Methods) mavzusini o'rganamiz
Savollaringiz bo'lsa, yozib qoldiring! ๐