Assalomu alaykum, yosh dasturchilar! ๐
Bugun biz Abstract Classes'ni o'rganamiz
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")
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 - 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}")
# 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 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}")
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()
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}")
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!")
# 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!")
Barcha child class'lar bir xil method'larni implementatsiya qiladi
Abstract method'lar child class'da implementatsiya qilinishi kerak
Kod yaxshi tashkil etiladi va tushunarli bo'ladi
Umumiy funksionallikni qayta ishlatish
Abstract class yaratish uchun from abc import ABC, abstractmethod import qilish kerak
Abstract class ABC dan meros olishi kerak
Abstract method'lar @abstractmethod decorator bilan belgilanadi
Barcha abstract method'lar child class'da implementatsiya qilinishi kerak
Abstract class'dan to'g'ridan-to'g'ri object yaratib bo'lmaydi
To'liq implementatsiya qilinmagan class'lar
Abstract class'lar yaratish uchun
Abstract method'lar belgilash
Abstract property'lar yaratish
Amaliy misol bilan o'rganish
Keyingi dars: Advanced OOP Concepts mavzusini o'rganamiz
Savollaringiz bo'lsa, yozib qoldiring! ๐