โฌ…๏ธ Bosh sahifaga
1 / 15

๐Ÿ“š Python OOP - 5-dars

Encapsulation (Kapsulatsiya)

Ma'lumotlarni himoya qilish

Assalomu alaykum, yosh dasturchilar! ๐Ÿ˜Š
Bugun biz OOP'ning muhim prinsiplaridan biri - Encapsulation'ni o'rganamiz

120 daqiqa

๐Ÿ“‹ Dars rejasi

๐Ÿค” Encapsulation nima?

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!")

โœ… Encapsulation'ning afzalliklari

๐Ÿ”’ Xavfsizlik

Ma'lumotlarni himoya qilish

๐Ÿ›ก๏ธ Kodni himoya qilish

Noto'g'ri foydalanishdan himoya qilish

๐Ÿ”„ Moslashuvchanlik

Ichki tuzilishni o'zgartirish imkonini berish

๐Ÿ“‹ Tartibli kod

Ma'lumotlar va metodlarni tartibli saqlash

๐Ÿ” Private va Public attributes

Public attributes

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

Private attributes

    # 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 va Setter metodlar

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!")

โš™๏ธ Setter metodlar

    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

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 decorator ishlatish

    @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

๐Ÿฆ Amaliy loyiha: Bank hisob

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

๐Ÿ’ฐ Bank hisob metodlari

    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!")

๐Ÿงช Bank hisob test

    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")

๐ŸŽฏ Mashq

๐Ÿ“ฑ Vazifa: Telefon class
  • Telefon class yarating
  • Private attributes: __batareya, __parol, __max_chaqiruv
  • Property decorator: batareya, chaqiruv_soni
  • Getter/Setter metodlar: parol_tekshirish, batareya_qo'shish

Vaqt: 10 daqiqa โฐ

๐Ÿ  Uyga vazifa

๐Ÿ“ฑ Vazifa 1: Telefon class
  • Private attributes: __batareya, __parol, __max_chaqiruv
  • Property decorator: batareya, chaqiruv_soni
  • Getter/Setter metodlar: parol_tekshirish, batareya_qo'shish
๐Ÿ“š Vazifa 2: Kitob class
  • Private attributes: __sahifalar, __narx, __mavjud
  • Property decorator: sahifalar, narx, mavjud
  • Getter/Setter metodlar: sahifalar_tekshirish, narx_o'zgartirish
๐ŸŽฎ Vazifa 3: O'yinchi class
  • Private attributes: __jon, __kuch, __tajriba
  • Property decorator: jon, kuch, tajriba
  • Getter/Setter metodlar: jon_qo'shish, kuch_oshirish

๐ŸŽ‰ Xulosa

Bugun nimalarni o'rgandik?

๐Ÿ” Encapsulation

Ma'lumotlarni himoya qilish

๐Ÿ”’ Private attributes

__ bilan boshlanadi, faqat class ichidan kirish

๐Ÿ”ง Getter/Setter

Ma'lumotlarni xavfsiz boshqarish

๐Ÿท๏ธ Property decorator

Getter/setter'ni oddiy attribute kabi ishlatish

Keyingi dars: Special Methods (Magic Methods) mavzusini o'rganamiz

Savollaringiz bo'lsa, yozib qoldiring! ๐Ÿ˜Š