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.
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.
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 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
print(len("Programiz"))
print(len(["Python", "Java", "C"]))
print(len({"Name": "John", "Address": "Nepal"}))
Natija
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

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
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
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.
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
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
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

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