โฌ…๏ธ Bosh sahifaga
1 / 14

๐Ÿ“š Python OOP - 4-dars

Polymorphism (Ko'p shakllilik)

Bir xil interfeys, turli xatti-harakat

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

120 daqiqa

๐Ÿ“‹ Dars rejasi

๐Ÿค” Polymorphism nima?

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 ishlatish

# 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:

  • Moslashuvchanlik - bir xil kod turli object'lar bilan ishlaydi
  • Kodni qisqartirish - takroriy kodlarni kamaytirish
  • Oson kengaytirish - yangi class'lar qo'shish oson
  • Tushunarli kod - bir xil interfeys, turli xatti-harakat

๐Ÿ”„ Method Overriding bilan Polymorphism

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

๐Ÿš— Transport tizimi

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

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

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

๐Ÿงช Operator Overloading test

# 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:

  • Tabiiy kod - matematik ifodalar yozish
  • Tushunarli kod - operator'lar ma'noli
  • Kuchli funksionallik - murakkab hisob-kitoblar

๐Ÿ‘ฅ Amaliy loyiha: Shaxslar tizimi

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

๐Ÿ‘จโ€๐ŸŽ“ Shaxslar child class'lari

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

# 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

๐ŸŽฏ Mashq

๐ŸŽ Vazifa: Ovqat tizimi
  • Ovqat parent class yarating
  • Undan Non, Sabzavot, Meva child class'lar yarating
  • Har birida tayyorlanish va ta'm metodlarini override qiling
  • Polymorphism'dan foydalaning

Vaqt: 10 daqiqa โฐ

๐ŸŽ‰ Xulosa

Bugun nimalarni o'rgandik?

๐Ÿ”„ Polymorphism

Bir xil metod nomi, turli xatti-harakat

๐Ÿฆ† Duck Typing

Object'ning turi emas, metodlari muhim

โž• Operator Overloading

Operator'larni o'ziga xos tarzda ishlatish

๐ŸŽฏ Method Overriding

Child class'da parent metodini qayta yozish

Keyingi dars: Encapsulation (Kapsulatsiya) mavzusini o'rganamiz

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