Polimorfizm w Pythonie (z przykładami)

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 w funkcji len () w Pythonie

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

Polimorfizm w klasach nadrzędnych i potomnych w Pythonie

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

Interesujące artykuły...