首页 > 编程语言 >python 多态

python 多态

时间:2023-05-04 16:44:57浏览次数:42  
标签:area python self 多态 data def speak

在 Python3 中,多态是指同一个方法或者操作可以在不同的对象上产生不同的行为或结果。这意味着一个函数可以接受不同类型的参数,并且可以表现出不同的行为。

生活中的例子如下:

假设你想要买一台新电视机,你可能会去电器店看看有哪些电视可供选择。当你开始比较价格和功能时,你可能会发现有各种不同品牌、型号和尺寸的电视可供选择。这些电视在外观、大小和功能上可能不同,但它们都有一个共同的功能——显示画面。因此,当你把电视带回家后,你可以使用相同的方法(例如按电视遥控器上的“开”键)来打开不同品牌和型号的电视,它们都会显示画面。这就是多态:不同类型的电视实现了相同的方法,但是它们的行为却不同。

以下是一个简单的例子:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "汪汪"

class Cat(Animal):
    def speak(self):
        return "喵喵"

def animal_speak(animal):
    print(animal.speak())

dog = Dog("小狗")
cat = Cat("小猫")

animal_speak(dog)  # 输出:汪汪
animal_speak(cat)  # 输出:喵喵

这个例子中,我们定义了一个基类 Animal 和两个子类 DogCat。每个子类都重写了 speak() 方法,以便输出其特有的声音。在 animal_speak 函数中,我们接受一个任意的 Animal 类型的参数,并调用其 speak 方法,最终输出不同的结果。

因此,无论传递给 animal_speak 函数的参数是哪种类型的动物,它都会根据该对象的类型调用相应的方法,从而实现多态。

另一个例子是计算不同形状的面积:

class Shape:
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

def calculate_area(shape):
    print("面积:", shape.area())

rectangle = Rectangle(5, 10)
circle = Circle(7)

calculate_area(rectangle)  # 输出:面积:50
calculate_area(circle)     # 输出:面积:153.86

在这个例子中,我们定义了一个基类 Shape 和两个子类 RectangleCircle。每个子类都重写了 area() 方法来计算其特定形状的面积。在 calculate_area() 函数中,我们接受一个任意的 Shape 类型的参数,并调用其 area() 方法,最终输出不同的结果。

因此,无论传递给 calculate_area() 函数的参数是哪种类型的形状,它都会根据该对象的类型调用相应的方法,从而实现多态。

还有一个例子是使用多态实现不同类型的排序:

class Sorter:
    def sort(self, data):
        pass

class BubbleSort(Sorter):
    def sort(self, data):
        # 冒泡排序算法
        print("冒泡排序:", sorted(data))

class QuickSort(Sorter):
    def sort(self, data):
        # 快速排序算法
        print("快速排序:", sorted(data))

def sort_data(sorter, data):
    sorter.sort(data)

data = [3, 2, 1, 5, 4]
bubble_sorter = BubbleSort()
quick_sorter = QuickSort()

sort_data(bubble_sorter, data)   # 输出:冒泡排序:[1, 2, 3, 4, 5]
sort_data(quick_sorter, data)    # 输出:快速排序:[1, 2, 3, 4, 5]

在这个例子中,我们定义了一个基类 Sorter 和两个子类 BubbleSortQuickSort。每个子类都重写了 sort() 方法以实现其特定的排序算法。在 sort_data() 函数中,我们接受一个任意的 Sorter 类型的参数和一组需要排序的数据,并调用 sort() 方法对数据进行排序,最终输出不同结果。

因此,无论传递给 sort_data() 函数的参数是哪种类型的排序器,它都会根据该对象的类型调用相应的方法,从而实现多态。

在使用多态的时候,需要注意以下几点:

  1. 定义基类时需要考虑到所有子类的共性,并设计出一些通用的方法,而这些方法需要在所有子类中都有意义。

  2. 子类需要重写父类的方法,并且该方法需要与父类的方法具有相同的名称、参数和返回类型。否则,在使用多态时可能会出现错误。

  3. 在使用多态的函数或方法中,需要确保传递给它们的参数是正确的类型。如果传递了错误的类型,那么程序可能会在运行时发生异常。

  4. 在编写多态的代码时,需要注意代码的可读性和可维护性。过于复杂的继承关系和方法重载可能会使代码变得难以理解和维护。

总之,使用多态可以大大增加代码的灵活性和可扩展性。但是,我们需要仔细设计和实现多态的基类和子类,并在使用多态的时候保持谨慎和小心,以确保程序的正确性和稳定性。

标签:area,python,self,多态,data,def,speak
From: https://www.cnblogs.com/yund/p/17371708.html

相关文章

  • SDN Python编程创建多数据中心网络
    首先开启OpenDaylightcd/home/ubuntu/karaf-0.7.1/bin/./karaf新开一个终端执行以下操作在/home/ubuntu/mininet/examples目录下新建一个sdn4.py文件输入以下代码frommininet.topoimportTopoclassMyTopo(Topo):def__init__(self):Topo.__init......
  • python 迭代器和推导式的不同处
    迭代器和推导式都是在Python中用于处理可迭代对象的机制,但它们之间有一些关键区别。返回值类型不同:推导式返回一个新的数据结构(列表、集合、字典等),而迭代器返回一个迭代器对象。推导式生成的是一个新的序列或集合,而迭代器则是逐个生成元素。实现方式不同:推导式是一种高级语......
  • Python时间模块time
    时间模块-time#time()获取本地时间戳#ctime()获取本地时间字符串(参数是时间戳,默认当前)#localtime()获取本地时间元组(参数是时间戳,默认当前)#mktime()通过时间元组获取时间戳(参数是时间元组)#asctime()通过时间元组获取时......
  • python 推导式
    在Python中,列表推导式、字典推导式和集合推导式都是常见的推导式。它们可以让我们使用一种简洁而强大的语法来快速创建新的序列或映射数据类型。列表推导式列表推导式是最常见的一种推导式,用于通过对一个序列中的每个元素应用一个表达式来快速生成一个新的列表。列表推导式的......
  • python-Gradio 机器学习演示库
    python-GradioGradio是一个开源的Python库,用于构建机器学习和数据科学演示应用。有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面。Gradio适用于以下情况:为客户/合作者/用户/学生演示你的机器学习模型。通过自动共享链接快速部署你的......
  • python 列表拼接拓展
    #-*-coding:utf-8-*-#列表例存放字节类型数据bytes_list=[b'1',b'2',b'3']#列表里存放字符串类型数据str_list=['1','2','3']#列表里存放混合类型数据(字符串,字节,int)mix_list=[b'1','2','3&#......
  • Python网页应用开发神器fac 0.2.6版本重要新功能一览
    fac项目地址:https://github.com/CNFeffery/feffery-antd-components,欢迎star支持大家好我是费老师,距离我的开源Python网页应用通用组件库fac的0.2.0版本发布已过去半个多月的时间,在国内外众多fac用户的反馈建议下,经过高强度的优化和功能更新,目前fac已经更新到0.2.6版本,且......
  • Python报错:Can't connect to HTTPS URL because the SSL module is not available
    参考文章:(32条消息)Can‘tconnecttoHTTPSURLbecausetheSSLmoduleisnotavailable-关于anaconda中的SSL模块错误_anacondahttps报错_Sky_Tree_Delivery的博客-CSDN博客具体操作:将以下文件移动位置D:\Anaconda\Library\bin->D:\Anaconda\DLLs(此处D盘为我自己的安......
  • SDN 编写Python脚本创建自定义网络拓扑
    编写Python脚本创建自定义网络拓扑,包括5台交换机5台主机frommininet.topoimportTopoclassRingTopo(Topo):def__init__(self):Topo.__init__(self)#Createswitchess_num=5h_num=5switches=[]hosts......
  • python11:局部变量与全局变量
    局部变量:在函数内部定义的变量,作用域仅仅局限在函数的内部。不同的函数可以定义相同的局部变量,但是各自用各自的不会产生影响注意:局部变量在函数执行完毕后会释放作用:为了临时的保存数据,需要在函数中定义来进行存储。全局变量:当全局变量和局部变量出现重复定义的时候,程序就......