โฌ…๏ธ Bosh sahifaga
1 / 14

๐Ÿ“š Python OOP - 8-dars

Abstract Classes

ABC (Abstract Base Classes)

Assalomu alaykum, yosh dasturchilar! ๐Ÿ˜Š
Bugun biz Abstract Classes'ni o'rganamiz

120 daqiqa

๐Ÿ“‹ Dars rejasi

๐Ÿค” Abstract Classes nima?

Abstract Class - bu to'liq implementatsiya qilinmagan class. U faqat method'lar nomini belgilaydi, lekin ularning ichki qismini yozmaydi.

๐Ÿ’ก Real hayotdan misol:

Agar sizda "Transport" nomli abstract class bo'lsa, u faqat "harakatlanish" method'ini belgilaydi, lekin qanday harakatlanishni aytmaydi. Avtomobil, velosiped, samolyot kabi konkret class'lar bu method'ni o'z usulida implementatsiya qiladi.

from abc import ABC, abstractmethod

class Transport(ABC):
    def __init__(self, nomi, tezlik):
        self.nomi = nomi
        self.tezlik = tezlik
    
    @abstractmethod
    def harakatlanish(self):
        pass  # Bu method child class'da implementatsiya qilinishi kerak
    
    def ma_lumot_ko_rsatish(self):
        print(f"Transport: {self.nomi}, Tezlik: {self.tezlik} km/h")

๐Ÿ“ฆ ABC moduli

Python'da abstract class'lar yaratish uchun abc moduli ishlatiladi.

from abc import ABC, abstractmethod, abstractproperty

class Hayvon(ABC):
    def __init__(self, nomi, yoshi):
        self.nomi = nomi
        self.yoshi = yoshi
    
    @abstractmethod
    def ovqatlanish(self):
        """Har bir hayvon o'z usulida ovqatlanadi"""
        pass
    
    @abstractmethod
    def uxlash(self):
        """Har bir hayvon o'z usulida uxlaydi"""
        pass
    
    @abstractproperty
    def turi(self):
        """Har bir hayvonning o'z turi bor"""
        pass
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.nomi} ma'lumotlari ===")
        print(f"Yoshi: {self.yoshi}")
        print(f"Turi: {self.turi}")

๐Ÿท๏ธ @abstractmethod decorator

@abstractmethod decorator - method'ni abstract qiladi va child class'da implementatsiya qilinishini majbur qiladi.

class Mashina(Transport):
    def __init__(self, nomi, tezlik, yoqilgi):
        super().__init__(nomi, tezlik)
        self.yoqilgi = yoqilgi
    
    def harakatlanish(self):  # Abstract method'ni implementatsiya qilish
        print(f"{self.nomi} yo'lda {self.tezlik} km/h tezlikda harakatlanmoqda")
        print(f"Yoqilgi: {self.yoqilgi}")
    
    def signal_berish(self):
        print("Bip-bip!")

class Velosiped(Transport):
    def __init__(self, nomi, tezlik, pedallar_soni):
        super().__init__(nomi, tezlik)
        self.pedallar_soni = pedallar_soni
    
    def harakatlanish(self):  # Abstract method'ni implementatsiya qilish
        print(f"{self.nomi} pedallar bilan {self.tezlik} km/h tezlikda harakatlanmoqda")
        print(f"Pedallar soni: {self.pedallar_soni}")

๐Ÿงช Abstract method test

# Test qilish
print("=== Transport test ===")

# Mashina yaratish
mashina = Mashina("Toyota Camry", 120, "Benzin")
mashina.ma_lumot_ko_rsatish()
mashina.harakatlanish()
mashina.signal_berish()

print("\n" + "="*50 + "\n")

# Velosiped yaratish
velosiped = Velosiped("Mountain Bike", 25, 2)
velosiped.ma_lumot_ko_rsatish()
velosiped.harakatlanish()

print("\n" + "="*50 + "\n")

# Abstract class'dan to'g'ridan-to'g'ri object yaratishga urinish
try:
    transport = Transport("Test", 100)  # Xato!
except TypeError as e:
    print(f"Xato: {e}")
    print("Abstract class'dan to'g'ridan-to'g'ri object yaratib bo'lmaydi!")

๐Ÿ”ง Abstract properties

Abstract property'lar ham yaratish mumkin. Ular child class'da implementatsiya qilinishi kerak.

from abc import ABC, abstractmethod, abstractproperty

class GeometrikShakl(ABC):
    def __init__(self, nomi):
        self.nomi = nomi
    
    @abstractproperty
    def yuzasi(self):
        """Har bir shaklning o'z yuzasi hisoblash usuli"""
        pass
    
    @abstractproperty
    def perimetri(self):
        """Har bir shaklning o'z perimetri hisoblash usuli"""
        pass
    
    @abstractmethod
    def ma_lumot_ko_rsatish(self):
        """Har bir shakl o'z ma'lumotlarini ko'rsatadi"""
        pass

class Uchburchak(GeometrikShakl):
    def __init__(self, nomi, a, b, c):
        super().__init__(nomi)
        self.a = a
        self.b = b
        self.c = c
    
    @property
    def yuzasi(self):
        # Geron formulasi
        p = (self.a + self.b + self.c) / 2
        return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
    
    @property
    def perimetri(self):
        return self.a + self.b + self.c
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.nomi} ma'lumotlari ===")
        print(f"Tomonlar: {self.a}, {self.b}, {self.c}")
        print(f"Yuzasi: {self.yuzasi:.2f}")
        print(f"Perimetri: {self.perimetri}")

๐Ÿงช Abstract properties test

class To_rtburchak(GeometrikShakl):
    def __init__(self, nomi, uzunlik, kenglik):
        super().__init__(nomi)
        self.uzunlik = uzunlik
        self.kenglik = kenglik
    
    @property
    def yuzasi(self):
        return self.uzunlik * self.kenglik
    
    @property
    def perimetri(self):
        return 2 * (self.uzunlik + self.kenglik)
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.nomi} ma'lumotlari ===")
        print(f"Uzunlik: {self.uzunlik}, Kenglik: {self.kenglik}")
        print(f"Yuzasi: {self.yuzasi}")
        print(f"Perimetri: {self.perimetri}")

# Test qilish
print("=== Geometrik shakllar test ===")

uchburchak = Uchburchak("ABC uchburchak", 3, 4, 5)
uchburchak.ma_lumot_ko_rsatish()

print("\n" + "="*50 + "\n")

to_rtburchak = To_rtburchak("ABCD to'rtburchak", 5, 3)
to_rtburchak.ma_lumot_ko_rsatish()

๐Ÿพ Amaliy loyiha: Hayvonlar

from abc import ABC, abstractmethod, abstractproperty

class Hayvon(ABC):
    def __init__(self, nomi, yoshi, vazni):
        self.nomi = nomi
        self.yoshi = yoshi
        self.vazni = vazni
        self.energiya = 100
    
    @abstractmethod
    def ovqatlanish(self):
        """Har bir hayvon o'z usulida ovqatlanadi"""
        pass
    
    @abstractmethod
    def uxlash(self):
        """Har bir hayvon o'z usulida uxlaydi"""
        pass
    
    @abstractmethod
    def harakatlanish(self):
        """Har bir hayvon o'z usulida harakatlanadi"""
        pass
    
    @abstractproperty
    def turi(self):
        """Har bir hayvonning o'z turi bor"""
        pass
    
    @abstractproperty
    def ovqat_turi(self):
        """Har bir hayvonning o'z ovqat turi bor"""
        pass
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.nomi} ma'lumotlari ===")
        print(f"Turi: {self.turi}")
        print(f"Yoshi: {self.yoshi}")
        print(f"Vazni: {self.vazni} kg")
        print(f"Energiya: {self.energiya}%")
        print(f"Ovqat turi: {self.ovqat_turi}")

๐Ÿ• Hayvonlar class'lari

class It(Hayvon):
    def __init__(self, nomi, yoshi, vazni, zot):
        super().__init__(nomi, yoshi, vazni)
        self.zot = zot
    
    @property
    def turi(self):
        return "It"
    
    @property
    def ovqat_turi(self):
        return "Go'sht va don"
    
    def ovqatlanish(self):
        if self.energiya < 80:
            self.energiya += 30
            print(f"{self.nomi} go'sht yedi. Energiya: {self.energiya}%")
        else:
            print(f"{self.nomi} hozir och emas!")
    
    def uxlash(self):
        self.energiya += 20
        print(f"{self.nomi} uxlayapti... Energiya: {self.energiya}%")
    
    def harakatlanish(self):
        if self.energiya >= 10:
            self.energiya -= 10
            print(f"{self.nomi} yugurmoqda... Energiya: {self.energiya}%")
        else:
            print(f"{self.nomi} juda charchagan, dam olishi kerak!")

class Mushuk(Hayvon):
    def __init__(self, nomi, yoshi, vazni, rang):
        super().__init__(nomi, yoshi, vazni)
        self.rang = rang
    
    @property
    def turi(self):
        return "Mushuk"
    
    @property
    def ovqat_turi(self):
        return "Baliq va sut"
    
    def ovqatlanish(self):
        if self.energiya < 70:
            self.energiya += 40
            print(f"{self.nomi} baliq yedi. Energiya: {self.energiya}%")
        else:
            print(f"{self.nomi} hozir och emas!")
    
    def uxlash(self):
        self.energiya += 25
        print(f"{self.nomi} uxlayapti... Energiya: {self.energiya}%")
    
    def harakatlanish(self):
        if self.energiya >= 15:
            self.energiya -= 15
            print(f"{self.nomi} sakrayapti... Energiya: {self.energiya}%")
        else:
            print(f"{self.nomi} juda charchagan, dam olishi kerak!")

๐Ÿงช Hayvonlar test

# Test qilish
print("=== Hayvonlar test ===")

# It yaratish
it = It("Rex", 3, 25, "Olmon cho'pon iti")
it.ma_lumot_ko_rsatish()

print("\n=== It harakatlari ===")
it.harakatlanish()
it.harakatlanish()
it.ovqatlanish()
it.uxlash()

print("\n" + "="*50 + "\n")

# Mushuk yaratish
mushuk = Mushuk("Mimi", 2, 4, "Oq")
mushuk.ma_lumot_ko_rsatish()

print("\n=== Mushuk harakatlari ===")
mushuk.harakatlanish()
mushuk.ovqatlanish()
mushuk.uxlash()

print("\n" + "="*50 + "\n")

# Abstract class'dan to'g'ridan-to'g'ri object yaratishga urinish
try:
    hayvon = Hayvon("Test", 1, 1)  # Xato!
except TypeError as e:
    print(f"Xato: {e}")
    print("Abstract class'dan to'g'ridan-to'g'ri object yaratib bo'lmaydi!")

โœ… Abstract class'ning afzalliklari

๐Ÿ“‹ Standartlashtirish

Barcha child class'lar bir xil method'larni implementatsiya qiladi

๐Ÿ”’ Majburiy implementatsiya

Abstract method'lar child class'da implementatsiya qilinishi kerak

๐Ÿ—๏ธ Kod tuzilishi

Kod yaxshi tashkil etiladi va tushunarli bo'ladi

๐Ÿ”„ Qayta ishlatish

Umumiy funksionallikni qayta ishlatish

๐Ÿ“ Abstract class qoidalari

1. ABC import qilish

Abstract class yaratish uchun from abc import ABC, abstractmethod import qilish kerak

2. ABC dan meros olish

Abstract class ABC dan meros olishi kerak

3. @abstractmethod decorator

Abstract method'lar @abstractmethod decorator bilan belgilanadi

4. Child class'da implementatsiya

Barcha abstract method'lar child class'da implementatsiya qilinishi kerak

5. Object yaratish taqiqlangan

Abstract class'dan to'g'ridan-to'g'ri object yaratib bo'lmaydi

๐ŸŽ‰ Xulosa

Bugun nimalarni o'rgandik?

๐Ÿ—๏ธ Abstract Classes

To'liq implementatsiya qilinmagan class'lar

๐Ÿ“ฆ ABC moduli

Abstract class'lar yaratish uchun

๐Ÿท๏ธ @abstractmethod

Abstract method'lar belgilash

๐Ÿ”ง Abstract properties

Abstract property'lar yaratish

๐Ÿพ Hayvonlar loyihasi

Amaliy misol bilan o'rganish

Keyingi dars: Advanced OOP Concepts mavzusini o'rganamiz

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