Python 基础教程

Python 流程控制

Python 函数

Python 数据类型

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

Python 多态

在本教程中,我们将学习多态,不同类型的多态以及如何借助示例演示在Python中实现它们。

什么是多态?

多态性的字面意思是指以不同形式出现的条件。

多态是编程中非常重要的概念。它指的是使用单个类型实体(方法,运算符或对象)来表示不同场景中的不同类型。

让我们举个实例:

示例1:加法运算符的多态

我们知道 + 运算符已在Python程序中广泛使用。但是,它没有单一用法。

对于整数数据类型,使用 + 运算符执行算术加法运算。

num1 = 1
num2 = 2
print(num1+num2)

因此,以上程序输出 3

类似地,对于字符串数据类型,使用 + 运算符进行连接。

str1 = "Python"
str2 = "Programming"
print(str1+" "+str2)

结果,以上程序输出 : Python Programming

在这里,我们可以看到使用运算符 + 对不同的数据类型执行了不同的操作。这是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中创建具有相同名称但参数不同的方法的方法。