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