在本教程中,我们将学习多态,不同类型的多态以及如何借助示例演示在Python中实现它们。
多态性的字面意思是指以不同形式出现的条件。
多态是编程中非常重要的概念。它指的是使用单个类型实体(方法,运算符或对象)来表示不同场景中的不同类型。
让我们举个实例:
我们知道 + 运算符已在Python程序中广泛使用。但是,它没有单一用法。
对于整数数据类型,使用 + 运算符执行算术加法运算。
num1 = 1 num2 = 2 print(num1+num2)
因此,以上程序输出 3
类似地,对于字符串数据类型,使用 + 运算符进行连接。
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
结果,以上程序输出 : Python Programming
在这里,我们可以看到使用运算符 + 对不同的数据类型执行了不同的操作。这是Python中最简单的多态现象之一。
Python中有一些函数可以与多种数据类型兼容。
其中一种这样的函数是len()函数。它可以在Python中与许多数据类型一起运行。让我们看一下该函数的一些示例用例。
print(len("nhooo")) print(len(["Python", "Java", "C"])) print(len({"Name": "John", "Address": "Nepal"}))
输出结果
5 3 2
在这里,我们可以看到许多数据类型(例如字符串,列表,元组,集合和字典)都可以使用len()函数。但是,我们可以看到它返回有关特定数据类型的特定信息。
在面向对象编程中,多态是一个非常重要的概念。
要了解有关Python中OOP的更多信息,请访问: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中的子类也从父类继承方法和属性。我们可以专门针对子类重新定义某些方法和属性,这称为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解释器自动识别出对象a(Square类)的fact()方法被重写。它使用了在子类中定义的那个。
另一方面,由于对象b的fact()方法没有被重写,因此可以从Parent Shape类中使用它。
注意:方法重载是一种无法在Python中创建具有相同名称但参数不同的方法的方法。