W tym samouczku dowiemy się o polimorfizmie, różnych typach polimorfizmu oraz o tym, jak możemy je zaimplementować w Pythonie za pomocą przykładów.
Co to jest polimorfizm?
Dosłowne znaczenie polimorfizmu to warunek występowania w różnych formach.
Polimorfizm to bardzo ważna koncepcja w programowaniu. Odnosi się do użycia encji jednego typu (metody, operatora lub obiektu) do reprezentowania różnych typów w różnych scenariuszach.
Weźmy przykład:
Przykład 1: Polimorfizm i operator dodawania
Wiemy, że +
operator jest szeroko stosowany w programach Pythona. Ale nie ma jednego zastosowania.
W przypadku typów danych całkowitych +
operator służy do wykonywania operacji dodawania arytmetycznego.
num1 = 1 num2 = 2 print(num1+num2)
Stąd powyższy program daje 3.
Podobnie w przypadku typów danych typu łańcuchowego +
do wykonania konkatenacji służy operator.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
W rezultacie powyższy program generuje programowanie w języku Python.
Tutaj widzimy, że jeden operator +
był używany do wykonywania różnych operacji dla różnych typów danych. Jest to jedno z najprostszych przypadków polimorfizmu w Pythonie.
Polimorfizm funkcji w Pythonie
W Pythonie jest kilka funkcji, które są kompatybilne z wieloma typami danych.
Jedną z takich funkcji jest len()
funkcja. Może działać z wieloma typami danych w Pythonie. Spójrzmy na kilka przykładowych przypadków użycia funkcji.
Przykład 2: Polimorficzna funkcja len ()
print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal")))
Wynik
9 3 2
Tutaj widzimy, że wiele typów danych, takich jak ciąg, lista, krotka, zestaw i słownik, może współpracować z len()
funkcją. Widzimy jednak, że zwraca konkretne informacje o określonych typach danych.

Polimorfizm klas w Pythonie
Polimorfizm jest bardzo ważnym pojęciem w programowaniu obiektowym.
Aby dowiedzieć się więcej o OOP w Pythonie, odwiedź: Python Object-Oriented Programming
Możemy wykorzystać koncepcję polimorfizmu podczas tworzenia metod klasowych, ponieważ Python pozwala różnym klasom mieć metody o tej samej nazwie.
Następnie możemy później uogólnić wywoływanie tych metod, pomijając obiekt, z którym pracujemy. Spójrzmy na przykład:
Przykład 3: Polimorfizm w metodach klasowych
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()
Wynik
Miau, jestem kotem. Mam na imię Kitty. Mam 2,5 roku. Meow Bark Jestem psem. Mam na imię Fluffy. Mam 4 lata. Szczekać
Tutaj stworzyliśmy dwie klasy Cat
i Dog
. Mają podobną strukturę i te same nazwy metod info()
i make_sound()
.
Zwróć jednak uwagę, że nie stworzyliśmy wspólnej superklasy ani nie połączyliśmy klas w żaden sposób. Nawet wtedy możemy spakować te dwa różne obiekty w krotkę i iterować przez nią, używając wspólnej zmiennej zwierzęcej. Jest to możliwe dzięki polimorfizmowi.
Polimorfizm i dziedziczenie
Podobnie jak w innych językach programowania, klasy potomne w Pythonie również dziedziczą metody i atrybuty z klasy nadrzędnej. Możemy przedefiniować niektóre metody i atrybuty specjalnie, aby pasowały do klasy potomnej, co jest znane jako przesłanianie metod .
Polimorfizm umożliwia nam dostęp do tych nadpisanych metod i atrybutów, które mają taką samą nazwę jak klasa nadrzędna.
Spójrzmy na przykład:
Przykład 4: przesłanianie metody
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())
Wynik
Okrąg Jestem dwuwymiarowym kształtem. Kwadraty mają każdy kąt równy 90 stopni. 153.93804002589985
Tutaj widzimy, że metody takie jak __str__()
, które nie zostały nadpisane w klasach potomnych, są używane z klasy nadrzędnej.
Z powodu polimorfizmu interpreter języka Python automatycznie rozpoznaje, że fact()
metoda obiektu a
(klasa Square) jest nadpisywana. Więc używa tego zdefiniowanego w klasie potomnej.
Z drugiej strony, ponieważ fact()
metoda dla obiektu b nie jest nadpisywana, jest używana z klasy Parent Shape.

Uwaga : Przeciążanie metod , sposób tworzenia wielu metod o tej samej nazwie, ale z różnymi argumentami, nie jest możliwe w Pythonie.