⬅️ Bosh sahifaga
1 / 12

📚 Python OOP - 14-dars

Encapsulation (Inkapsulyatsiya)

Public, private, va protected atributlar

Assalomu alaykum, yosh dasturchilar! 😊
Bugun biz Encapsulation tushunchasini o'rganamiz

120 daqiqa

📋 Dars rejasi

🤔 Encapsulation nima?

Encapsulation — bu sinf ichidagi atributlar va metodlarni bir butun sifatida birlashtirish va ularga kirishni cheklash orqali ma'lumotlarni himoya qilish.

🛡️ Encapsulation afzalliklari:

  • Ma'lumotlarni tasodifiy o'zgartirishdan himoya qilish
  • Sinf ichki tuzilmasini tashqi foydalanuvchilardan yashirish
  • Kodni yanada xavfsiz va tartibli qilish
class Shaxs:
    def __init__(self, ism):
        self.ism = ism  # Public atribut

shaxs = Shaxs("Ali")
print(shaxs.ism)  # Ali
shaxs.ism = "Vali"  # Tashqaridan o'zgartirish mumkin
print(shaxs.ism)  # Vali

🔐 Atribut turlari

🟢 Public atributlar

Hamma joydan foydalanish mumkin (masalan, self.ism)

🟡 Protected atributlar

Faqat sinf va uning voris sinflari ichida ishlatiladi (masalan, self._ism)

🔴 Private atributlar

Faqat sinf ichida ishlatiladi (masalan, self.__ism)

🟢 Public atributlar

Public atributlar - hamma joydan foydalanish mumkin:

class Talaba:
    def __init__(self, ism, yosh):
        self.ism = ism      # Public atribut
        self.yosh = yosh    # Public atribut
    
    def malumot(self):
        return f"Ism: {self.ism}, Yosh: {self.yosh}"

# Test qilish
talaba = Talaba("Ali", 20)
print(talaba.ism)        # Ali
print(talaba.yosh)       # 20
print(talaba.malumot())  # Ism: Ali, Yosh: 20

# Tashqaridan o'zgartirish mumkin
talaba.ism = "Vali"
talaba.yosh = 21
print(talaba.malumot())  # Ism: Vali, Yosh: 21

🟡 Protected atributlar

Protected atributlar - faqat sinf va uning voris sinflari ichida ishlatiladi:

class Shaxs:
    def __init__(self, ism, yosh):
        self.ism = ism      # Public atribut
        self._yosh = yosh   # Protected atribut (bitta underscore)
    
    def yoshni_korsat(self):
        return f"Yosh: {self._yosh}"

class Talaba(Shaxs):
    def __init__(self, ism, yosh, kurs):
        super().__init__(ism, yosh)
        self.kurs = kurs
    
    def toliq_malumot(self):
        return f"Ism: {self.ism}, Yosh: {self._yosh}, Kurs: {self.kurs}"

# Test qilish
talaba = Talaba("Zilola", 19, 2)
print(talaba.ism)           # Zilola
print(talaba._yosh)         # 19 (ishlaydi, lekin tavsiya qilinmaydi)
print(talaba.toliq_malumot())  # Ism: Zilola, Yosh: 19, Kurs: 2

🔴 Private atributlar

Private atributlar - faqat sinf ichida ishlatiladi:

class Bank_Hisob:
    def __init__(self, ism, boshlangich_summa):
        self.ism = ism                    # Public
        self.__summa = boshlangich_summa  # Private (ikki underscore)
    
    def summani_korsat(self):
        return f"Hisob: {self.__summa} so'm"
    
    def pul_qoshish(self, miqdor):
        if miqdor > 0:
            self.__summa += miqdor
            return f"{miqdor} so'm qo'shildi. Yangi hisob: {self.__summa} so'm"
        else:
            return "Noto'g'ri miqdor!"
    
    def pul_olish(self, miqdor):
        if 0 < miqdor <= self.__summa:
            self.__summa -= miqdor
            return f"{miqdor} so'm olindi. Qolgan hisob: {self.__summa} so'm"
        else:
            return "Yetarli mablag' yo'q!"

# Test qilish
hisob = Bank_Hisob("Ali", 100000)
print(hisob.ism)                    # Ali
print(hisob.summani_korsat())       # Hisob: 100000 so'm
print(hisob.pul_qoshish(50000))     # 50000 so'm qo'shildi. Yangi hisob: 150000 so'm
print(hisob.pul_olish(30000))       # 30000 so'm olindi. Qolgan hisob: 120000 so'm

# Private atributga to'g'ridan-to'g'ri kirish mumkin emas
# print(hisob.__summa)  # Xatolik!

🔧 Getter va Setter metodlari

Private atributlarga xavfsiz kirish uchun getter va setter metodlari:

class Talaba:
    def __init__(self, ism, yosh):
        self.ism = ism
        self.__yosh = yosh  # Private atribut
    
    # Getter metodi
    def get_yosh(self):
        return self.__yosh
    
    # Setter metodi
    def set_yosh(self, yangi_yosh):
        if 0 < yangi_yosh < 100:
            self.__yosh = yangi_yosh
            return f"Yosh o'zgartirildi: {self.__yosh}"
        else:
            return "Noto'g'ri yosh!"
    
    def malumot(self):
        return f"Ism: {self.ism}, Yosh: {self.__yosh}"

# Test qilish
talaba = Talaba("Sardor", 18)
print(talaba.get_yosh())        # 18
print(talaba.set_yosh(19))      # Yosh o'zgartirildi: 19
print(talaba.set_yosh(-5))      # Noto'g'ri yosh!
print(talaba.malumot())         # Ism: Sardor, Yosh: 19

💪 Amaliy mashq 1

🏦 Bank hisobi

Vazifa: Bank hisobi sinfini yarating

  • ism - public atribut
  • __summa - private atribut
  • get_summa() - getter metodi
  • set_summa() - setter metodi (faqat musbat qiymatlar)
  • pul_qoshish() va pul_olish() metodlari

Vaqt: 10 daqiqa

💪 Amaliy mashq 2

🚗 Mashina sinfi

Vazifa: Mashina sinfini yarating

  • model - public atribut
  • __tezlik - private atribut
  • _rang - protected atribut
  • Getter va setter metodlari
  • Tezlikni oshirish va kamaytirish metodlari

Vaqt: 10 daqiqa

🏠 Uy vazifasi

👨‍🎓 Vazifa 1: Talaba sinfi
  • ism - public atribut
  • __baho - private atribut (0-100 orasida)
  • Getter va setter metodlari
  • Bahoni oshirish va kamaytirish metodlari
🏠 Vazifa 2: Uy sinfi
  • manzil - public atribut
  • __narx - private atribut
  • _maydon - protected atribut
  • Getter va setter metodlari
📱 Vazifa 3: Telefon sinfi
  • model - public atribut
  • __battery - private atribut (0-100%)
  • Battery ni oshirish va kamaytirish metodlari

🎉 Xulosa

Bugun nimalarni o'rgandik?

🟢 Public atributlar

Hamma joydan foydalanish mumkin

🟡 Protected atributlar

Faqat sinf va voris sinflar ichida

🔴 Private atributlar

Faqat sinf ichida ishlatiladi

🔧 Getter/Setter

Xavfsiz kirish metodlari

Keyingi dars: Property dekoratori mavzusini o'rganamiz

Savollaringiz bo'lsa, yozib qoldiring! 😊