Skip to content

Python - Polimorfizm

Python Polimorfizmi

"Polimorfizm" so'zi "ko'p shakllar" degan ma'noni anglatadi va dasturlashda bu bir xil nomga ega bo'lgan metodlar/funksiyalar/operatorlarning ko'p obyektlar yoki sinflarda bajarilishi mumkinligini anglatadi.

Funksiya Polimorfizmi

Turli obyektlarda ishlatilishi mumkin bo'lgan Python funksiyasiga misol sifatida len() funksiyasini keltirish mumkin.

Satr

Satrlar uchun len() belgilar sonini qaytaradi:

Misol

python
x = "Salom Dunyo!"

print(len(x))

Tuple

Tuplelar uchun len() tupledagi elementlar sonini qaytaradi:

Misol

python
mening_tuplem = ("olma", "banan", "gilos")

print(len(mening_tuplem))

Lug'at

Lug'atlar uchun len() lug'atdagi kalit:qiymat juftliklari sonini qaytaradi:

Misol

python
ushbu_lugat = {
    "brend": "Ford",
    "model": "Mustang",
    "yil": 1964
}

print(len(ushbu_lugat))

Sinf Polimorfizmi

Polimorfizm ko'pincha sinf metodlarida ishlatiladi, bu yerda biz bir xil nomga ega bo'lgan bir nechta sinflarga ega bo'lishimiz mumkin.

Masalan, bizda uchta sinf bor deylik: Avto, Qayiq va Samolyot, va ularning hammasida harakat() deb nomlangan metod bor:

Misol

Bir xil metodga ega turli sinflar:

python
class Avto:
    def __init__(self, brend, model):
        self.brend = brend
        self.model = model

    def harakat(self):
        print("Haydash!")

class Qayiq:
    def __init__(self, brend, model):
        self.brend = brend
        self.model = model

    def harakat(self):
        print("Suzish!")

class Samolyot:
    def __init__(self, brend, model):
        self.brend = brend
        self.model = model

    def harakat(self):
        print("Uchish!")

avto1 = Avto("Ford", "Mustang")       # Avto obyektini yaratish
qayiq1 = Qayiq("Ibiza", "Touring 20") # Qayiq obyektini yaratish
samolyot1 = Samolyot("Boeing", "747") # Samolyot obyektini yaratish

for x in (avto1, qayiq1, samolyot1):
    x.harakat()

Oxiridagi for tsiklga qarang. Polimorfizm tufayli biz uchta sinf uchun ham bir xil metodni bajarishimiz mumkin.

Meros Sinf Polimorfizmi

Bir xil nomga ega bola sinflar bilan sinflar haqida nima deyish mumkin? Bu yerda polimorfizmdan foydalana olamizmi?

Ha. Agar yuqoridagi misoldan foydalansak va Transport deb nomlangan ota-ona sinf yaratsak, va Avto, Qayiq, Samolyot sinflarini Transportning bola sinflari qilsak, bola sinflar Transportning metodlarini meros qilib oladi, lekin ularni qayta yozishi mumkin:

Misol

Transport nomli sinf yarating va Avto, Qayiq, Samolyot sinflarini Transportning bola sinflari qiling:

python
class Transport:
    def __init__(self, brend, model):
        self.brend = brend
        self.model = model

    def harakat(self):
        print("Harakat!")

class Avto(Transport):
    pass

class Qayiq(Transport):
    def harakat(self):
        print("Suzish!")

class Samolyot(Transport):
    def harakat(self):
        print("Uchish!")

avto1 = Avto("Ford", "Mustang")       # Avto obyektini yaratish
qayiq1 = Qayiq("Ibiza", "Touring 20") # Qayiq obyektini yaratish
samolyot1 = Samolyot("Boeing", "747") # Samolyot obyektini yaratish

for x in (avto1, qayiq1, samolyot1):
    print(x.brend)
    print(x.model)
    x.harakat()

Bola sinflar ota-ona sinfdan xususiyatlar va metodlarni meros qilib oladi.

Yuqoridagi misolda Avto sinf bo'sh ekanligini ko'rishingiz mumkin, lekin u Transportdan brend, model va harakat() metodlarini meros qilib oladi.

Qayiq va Samolyot sinflari ham Transportdan brend, model va harakat() metodlarini meros qilib oladi, lekin ikkalasi ham harakat() metodini qayta yozadi.

Polimorfizm tufayli biz barcha sinflar uchun bir xil metodni bajarishimiz mumkin.