36 / 59

Polymorphism in Python

Polimorfizm nima?

Polimorfizmning so'zma-so'z ma'nosi — turli shakllarda yuzaga kelish holati.

Polimorfizm dasturlashda juda muhim tushuncha. U bitta turdagi obyektni (metod, operator yoki obyekt) turli ssenariylarda turli turlarni ifodalash uchun ishlatishga ishora qiladi.

Keling, bir misolni ko'ramiz:

1-misol: Qo'shish operatorida polimorfizm

Bizga ma'lumki, + operatori Python dasturlarida keng qo'llaniladi. Lekin, uning yagona qo'llanilishi yo'q.

Integer ma'lumot turlari uchun, + operatori arifmetik qo'shish amalini bajarish uchun ishlatiladi.

example.py
num1 = 1
num2 = 2
print(num1+num2)

Shuning uchun, yuqoridagi dastur 3ni chiqaradi.

Xuddi shunday, satr (string) ma'lumot turlari uchun, + operatori birlashtirish (concatenation) amalini bajarish uchun ishlatiladi.

example.py
str1 = "Python"
str2 = "Programming"
print(str1+" "+str2)

Natijada, yuqoridagi dastur Python Programmingni chiqaradi.

Bu yerda ko'rishimiz mumkinki, bitta + operatori turli ma'lumot turlari uchun turli amallarni bajarish uchun ishlatilgan. Bu Pythonda polimorfizmning eng sodda uchrashlaridan biri.

Pythonda funksional polimorfizm

Pythonda bir nechta ma'lumot turlari bilan ishlashga mos funksiyalar bor.

Shunday funksiyalardan biri — len() funksiyasi. U Pythonda ko'plab ma'lumot turlari bilan ishlashi mumkin. Keling, bu funksiyaning ba'zi qo'llanilish holatlariga misollarni ko'ramiz.

2-misol: Polimorfik len() funksiyasi

example.py
print(len("Programiz"))
print(len(["Python", "Java", "C"]))
print(len({"Name": "John", "Address": "Nepal"}))

Natija

kod
9
3
2

Bu yerda ko'rishimiz mumkinki, satr, ro'yxat, kortej, to'plam va lug'at kabi ko'plab ma'lumot turlari len() funksiyasi bilan ishlashi mumkin. Biroq, ko'rishimiz mumkinki, u muayyan ma'lumot turlari haqida muayyan ma'lumotni qaytaradi.

Pythonda len() funksiyasida polimorfizm

Pythonda funksional polimorfizm

Pythonda klass polimorfizmi

Polimorfizm — Ob'ektga yo'naltirilgan dasturlashda (Object-Oriented Programming) juda muhim tushuncha.

Pythonda OOP haqida ko'proq bilish uchun, tashrif buyuring: Python Object-Oriented Programming

Python turli klasslarga bir xil nomli metodlarga ega bo'lish imkonini bergani uchun, klass metodlarini yaratishda polimorfizm tushunchasidan foydalanishimiz mumkin.

Keyin biz qaysi obyekt bilan ishlayotganimizni e'tiborsiz qoldirib, bu metodlarni chaqirishni umumlashtirishimiz mumkin. Keling, bir misolni ko'ramiz:

3-misol: Klass metodlarida polimorfizm

example.py
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(f"I am a cat. My name is {self.name}. I am {self.age} years old.")

    def make_sound(self):
        print("Meow")

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(f"I am a dog. My name is {self.name}. I am {self.age} years old.")

    def make_sound(self):
        print("Bark")

cat1 = Cat("Kitty", 2.5)
dog1 = Dog("Fluffy", 4)

for animal in (cat1, dog1):
    animal.make_sound()
    animal.info()
    animal.make_sound()

Natija

kod
Meow
I am a cat. My name is Kitty. I am 2.5 years old.
Meow
Bark
I am a dog. My name is Fluffy. I am 4 years old.
Bark

Bu yerda, biz ikkita klass yaratdik: Cat va Dog. Ular o'xshash tuzilishga ega va bir xil info() va make_sound() metod nomlariga ega.

Biroq, e'tibor bering, biz umumiy katta klass yaratmadik yoki klasslarni hech qanday tarzda bog'lamadik. Shunga qaramay, biz bu ikki turli obyektni kortejga joylashtirib, umumiy animal o'zgaruvchisi yordamida ular bo'ylab aylanib chiqishimiz mumkin. Bu polimorfizm tufayli mumkin.

Polimorfizm va meros olish

Boshqa dasturlash tillaridagi kabi, Pythonda ham farzand klasslar ota klassdan metod va atributlarni meros oladi. Biz ba'zi metod va atributlarni maxsus ravishda farzand klassga moslashtirish uchun qayta belgilashimiz mumkin, bu metodni qayta belgilash (Method Overriding) deb ataladi.

Polimorfizm bizga ota klass bilan bir xil nomga ega bu qayta belgilangan metod va atributlarga murojaat qilish imkonini beradi.

Keling, bir misolni ko'ramiz:

4-misol: Metodni qayta belgilash

example.py
from math import pi

class Shape:
    def __init__(self, name):
        self.name = name

    def area(self):
        pass

    def fact(self):
        return "I am a two-dimensional shape."

    def __str__(self):
        return self.name

class Square(Shape):
    def __init__(self, length):
        super().__init__("Square")
        self.length = length

    def area(self):
        return self.length**2

    def fact(self):
        return "Squares have each angle equal to 90 degrees."

class Circle(Shape):
    def __init__(self, radius):
        super().__init__("Circle")
        self.radius = radius

    def area(self):
        return pi*self.radius**2

a = Square(4)
b = Circle(7)
print(b)
print(b.fact())
print(a.fact())
print(b.area())

Natija

kod
Circle
I am a two-dimensional shape.
Squares have each angle equal to 90 degrees.
153.93804002589985

Bu yerda ko'rishimiz mumkinki, farzand klasslarda qayta belgilanmagan __str__() kabi metodlar ota klassdan foydalaniladi.

Polimorfizm tufayli, Python interpretatori a obyekti (Square klassi) uchun fact() metodi qayta belgilanganini avtomatik taniydi. Shuning uchun, u farzand klassda aniqlangan metoddan foydalanadi.

Boshqa tomondan, b obyekti uchun fact() metodi qayta belgilanmagani uchun, u ota Shape klassidan foydalaniladi.

Pythonda ota va farzand klasslarda polimorfizm

Pythonda ota va farzand klasslarda polimorfizm

Eslatma: Bir xil nomga, lekin turli argumentlarga ega bir nechta metod yaratish usuli bo'lgan metodni ortiqcha yuklash (Method Overloading) Pythonda mumkin emas.

Ko'proq o'qing: Python Inheritance

QBilimingizni sinab ko'ring
1 / 3

1. Polimorfizm nimani anglatadi?