English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать полиморфизм, различные типы полиморфизма и как их демонстрировать с помощью примеров в Python.
Лiteralно, полиморфизм означает условия,出现的不同形式.
Полиморфизм - это важное concepto в программировании. Это означает использование единого типа сущности (метода, оператора или объекта) для представления различных сценариев с различными типами.
Давайте приведем пример:
Мы знаем, что оператор + широко используется в программах на Python. Однако, у него нет единственного использования.
Для типа данных целых чисел используется оператор + для выполнения арифметического сложения.
num1 = 1 num2 = 2 print(num1+num2)
Таким образом, вывод программы выше: 3
Аналогично, для типа данных строка, используется оператор + для их объединения.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
Результат, вывод программы выше: : Программирование на Python
Здесь мы можем увидеть, что оператор + выполняет различные действия с различными типами данных. Это один из самых простых примеров полиморфизма в Python.
В Python есть функции, которые兼容 с множеством типов данных.
Одной из таких функций является функция len(). Она может работать с многими типами данных в Python. Давайте посмотрим на несколько примеров использования этой функции.
print(len("w3codebox")) print(len(["Python", "Java", "C"])) print(len({"Name": "John", "Address": "Nepal"}))
Результат вывода
5 3 2
Здесь мы можем увидеть, что многие типы данных (например, строки, списки, кортежи, множества и словари) могут использовать функцию len(). Однако, мы можем увидеть, что она возвращает специфическую информацию о конкретном типе данных.
Полиморфизм - это非常重要的 концепция в面向 объектном программировании.
Чтобы узнать больше о OOP в Python, пожалуйста, посетите:Объектно-ориентированное программирование на Python
При создании методов класса мы можем использовать концепцию полиморфизма, так как Python позволяет различным классам иметь методы с одинаковыми именами.
Затем мы можем обобщить вызовы этих методов, позже игнорируя используемый объект. Давайте рассмотрим пример:
class Cat: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"Я кошка. Мое имя {self.name}. Мне {self.age} лет.") def make_sound(self): print("Meow") class Dog: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"Я собака. Мое имя {self.name}. Мне {self.age} лет.") 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()
Результат вывода
Meow Я кошка. Мое имя Kitty. Мне 2.5 года. Meow Bark Я собака. Мое имя Fluffy. Мне 4 года. Bark
Здесь мы создали два класса Cat и Dog. У них схожая структура и они имеют одинаковые имена методов info() и make_sound().
Но, пожалуйста, обратите внимание, что мы еще не создали общую суперкласс или никаким образом не свели эти классы вместе. Даже так, мы можем упаковать два различных объекта в кортеж и итерировать по ним с помощью общих переменных animal. Это разрешено благодаря полиморфизму.
Как и в других языках программирования, в Python подкласс также наследует методы и свойства от родительского класса. Мы можем专门 redefine некоторые методы и свойства для подкласса, что называетсяMethod Overriding(Переопределение методов).
Полиморфизм позволяет нам доступ к этим переопределенным методам и свойствам, имеющим такое же имя, как и в родительском классе.
Давайте рассмотрим пример:
from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "Я двумерная форма." 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 "Каждый угол квадрата составляет 90 градусов." 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())
Результат вывода
Circle Я двумерная форма. Каждый угол квадрата составляет 90 градусов. 153.93804002589985
Здесь мы видим, что в родительском классе используются методы, такие как __str__(), которые не были перезаписаны в подклассе.
Благодаря полиморфизму, интерпретатор Python автоматически определяет, что метод fact() объекта a (класс Square) был перезаписан. Он использует тот, который определен в подклассе.
С другой стороны, так как метод fact() объекта b не был перезаписан, его можно использовать из класса Parent Shape.
Внимание:Перегрузка методовЭто метод, который не может создать метод с тем же именем, но с różnymi parametrami, в Python.