Assalomu alaykum, yosh dasturchilar! ๐
Bugun biz OOP'ning eng qiziqarli prinsiplaridan biri - Polymorphism'ni o'rganamiz
Polymorphism - bu bir xil metod nomi, lekin turli class'larda turli xatti-harakat ko'rsatishi.
๐ก Real hayotdan misol:
Agar sizda "Ovqat" degan umumiy tushuncha bo'lsa, unda "Non", "Sabzavot", "Meva" kabi turli xil ovqatlar bor. Har birining o'ziga xos ta'mi va tayyorlanish usuli bor, lekin ularning barchasi "ovqat" deb ataladi.
class Hayvon:
def __init__(self, nom):
self.nom = nom
def ovoz_chiqarish(self):
print(f"{self.nom} ovoz chiqarayapti...")
class It(Hayvon):
def ovoz_chiqarish(self): # Method Overriding
print(f"{self.nom} havlayapti: Woof! Woof!")
class Mushuk(Hayvon):
def ovoz_chiqarish(self): # Method Overriding
print(f"{self.nom} miyovlayapti: Meow! Meow!")
class Qush(Hayvon):
def ovoz_chiqarish(self): # Method Overriding
print(f"{self.nom} qo'nqiroq qilayapti: Tweet! Tweet!")
# Polymorphism test qilish
hayvonlar = [
It("Rex"),
Mushuk("Mimi"),
Qush("Qarg'a")
]
print("=== Polymorphism misoli ===")
for hayvon in hayvonlar:
hayvon.ovoz_chiqarish() # Har bir hayvon o'ziga xos ovoz chiqaradi
โ Polymorphism'ning afzalliklari:
class Transport:
def __init__(self, nom, tezlik=0):
self.nom = nom
self.tezlik = tezlik
def harakatlanish(self):
print(f"{self.nom} harakatlanmoqda...")
def toxtash(self):
self.tezlik = 0
print(f"{self.nom} to'xtadi!")
class Mashina(Transport):
def __init__(self, nom, rang):
super().__init__(nom)
self.rang = rang
def harakatlanish(self): # Method Overriding
print(f"{self.rang} {self.nom} yo'lda harakatlanmoqda!")
print("Dvigatel ishlamoqda: Vroom! Vroom!")
self.tezlik = 60
def toxtash(self): # Method Overriding
self.tezlik = 0
print(f"{self.nom} yo'lda to'xtadi!")
print("Tormoz ishlamoqda: Squeak! Squeak!")
class Samolyot(Transport):
def __init__(self, nom, model):
super().__init__(nom)
self.model = model
def harakatlanish(self): # Method Overriding
print(f"{self.model} {self.nom} osmonda uchmoqda!")
print("Dvigatel ishlamoqda: Whoosh! Whoosh!")
self.tezlik = 800
def toxtash(self): # Method Overriding
self.tezlik = 0
print(f"{self.nom} aeroportda qo'ndi!")
print("Tormoz ishlamoqda: Screech! Screech!")
class Kema(Transport):
def __init__(self, nom, tur):
super().__init__(nom)
self.tur = tur
def harakatlanish(self): # Method Overriding
print(f"{self.tur} {self.nom} dengizda suzmoqda!")
print("Dvigatel ishlamoqda: Chug! Chug!")
self.tezlik = 30
Duck Typing - "Agar u o'rdak kabi yurasa va o'rdak kabi ovoz chiqarsa, demak u o'rdak!" degan prinsip.
class It:
def __init__(self, nom):
self.nom = nom
def ovoz_chiqarish(self):
print(f"{self.nom} havlayapti: Woof! Woof!")
def harakatlanish(self):
print(f"{self.nom} yugurmoqda...")
class Mushuk:
def __init__(self, nom):
self.nom = nom
def ovoz_chiqarish(self):
print(f"{self.nom} miyovlayapti: Meow! Meow!")
def harakatlanish(self):
print(f"{self.nom} sakramoqda...")
# Duck Typing funksiyasi
def hayvon_ko_rsatish(hayvon):
print(f"=== {hayvon.nom} ===")
hayvon.ovoz_chiqarish() # Har qanday hayvon uchun ishlaydi
hayvon.harakatlanish() # Har qanday hayvon uchun ishlaydi
Operator Overloading - class'da operator'larni (+, -, *, /, ==, !=) o'ziga xos tarzda ishlatish.
class Vektor:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self): # print() da ko'rsatish uchun
return f"Vektor({self.x}, {self.y})"
def __add__(self, boshqa): # + operator
return Vektor(self.x + boshqa.x, self.y + boshqa.y)
def __sub__(self, boshqa): # - operator
return Vektor(self.x - boshqa.x, self.y - boshqa.y)
def __mul__(self, son): # * operator
return Vektor(self.x * son, self.y * son)
def __eq__(self, boshqa): # == operator
return self.x == boshqa.x and self.y == boshqa.y
# Test qilish
v1 = Vektor(3, 4)
v2 = Vektor(1, 2)
print(f"v1 = {v1}")
print(f"v2 = {v2}")
print(f"v1 + v2 = {v1 + v2}")
print(f"v1 - v2 = {v1 - v2}")
print(f"v1 * 2 = {v1 * 2}")
print(f"v1 == v2: {v1 == v2}")
โ Operator Overloading'ning afzalliklari:
class Shaxs:
def __init__(self, ism, yosh):
self.ism = ism
self.yosh = yosh
self.jon = 100
def ishlash(self):
print(f"{self.ism} ishlayapti...")
self.jon -= 10
def dam_olish(self):
print(f"{self.ism} dam olayapti...")
self.jon += 20
def ma_lumot_ko_rsatish(self):
print(f"=== {self.ism} ma'lumotlari ===")
print(f"Yosh: {self.yosh}")
print(f"Jon: {self.jon}")
def __str__(self):
return f"{self.ism} ({self.yosh} yosh)"
class Talaba(Shaxs):
def __init__(self, ism, yosh, kurs):
super().__init__(ism, yosh)
self.kurs = kurs
self.ball = 0
def oqish(self): # Method Overriding
print(f"{self.ism} {self.kurs}-kursda o'qiyapti...")
self.ball += 5
self.jon -= 5
def ishlash(self): # Method Overriding
print(f"{self.ism} uy vazifasini qilayapti...")
self.ball += 3
self.jon -= 8
class O_qituvchi(Shaxs):
def __init__(self, ism, yosh, fan):
super().__init__(ism, yosh)
self.fan = fan
self.tajriba = 0
def dars_berish(self): # Method Overriding
print(f"{self.ism} {self.fan} fanidan dars berayapti...")
self.tajriba += 1
self.jon -= 12
def ishlash(self): # Method Overriding
print(f"{self.ism} dars tayyorlayapti...")
self.tajriba += 0.3
self.jon -= 6
# Polymorphism funksiyasi
def shaxs_ishlashi(shaxs):
print(f"=== {shaxs.ism} ishlayapti ===")
shaxs.ishlash() # Har qanday shaxs uchun ishlaydi
shaxs.ma_lumot_ko_rsatish()
print()
# Test qilish
shaxslar = [
Talaba("Ali", 18, 1),
O_qituvchi("Zilola", 35, "Matematika"),
Doktor("Sardor", 40, "Kardiolog")
]
print("=== Shaxslar tizimi ===")
for shaxs in shaxslar:
shaxs_ishlashi(shaxs) # Polymorphism
Vaqt: 10 daqiqa โฐ
Bir xil metod nomi, turli xatti-harakat
Object'ning turi emas, metodlari muhim
Operator'larni o'ziga xos tarzda ishlatish
Child class'da parent metodini qayta yozish
Keyingi dars: Encapsulation (Kapsulatsiya) mavzusini o'rganamiz
Savollaringiz bo'lsa, yozib qoldiring! ๐