当前位置: 首页 > news >正文

Python的多态

在 Python 中,多态(Polymorphism)是指不同的对象可以对相同的消息(方法调用)做出不同的响应。 简单来说,多态允许使用一个统一的接口来操作不同类型的对象,而这些对象会根据自身的类型来执行相应的具体操作。 例如,假设有一个父类 `Shape` 和几个子类 `Circle`、`Rectangle` 、`Triangle` ,它们都有一个 `area` 方法来计算面积。

class Shape:def area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, length, width):self.length = lengthself.width = widthdef area(self):return self.length * self.widthclass Triangle(Shape):def __init__(self, base, height):self.base = baseself.height = heightdef area(self):return 0.5 * self.base * self.height

然后,可以创建这些不同形状的对象,并通过相同的方式调用 area 方法来获取它们各自的面积计算结果。

shapes = [Circle(5), Rectangle(4, 6), Triangle(3, 8)]for shape in shapes:print(shape.area())

尽管都是调用 area 方法,但不同的子类对象会根据自己的实现计算并返回不同的结果,这就是多态的体现。它增加了代码的灵活性和可扩展性,使得程序更易于维护和扩展。 

多态性 示例:

#多态#继承:多态一定是发生在子类和父类之间的重写:子类重写父类中的方法class Animal:def say(self):print('animal')class Cat(Animal):def say(self):print('I am a cat')class Dog(Animal):def say(self):print('I am a dog')class Duck(Animal):def say(self):print('I am a duck')duck=Duck()
duck.say()dog=Dog()
dog.say()#输出分别为:
#I am a duck
#I am a dog

子类重写父类方法后同一个方法‘say’的输出不同,即呈现多态性。

在 Python 中,鸭子类型(Duck Typing)是一种编程风格。

其理念是:如果一个对象的行为(方法和属性)看起来像鸭子,走路像鸭子,叫声像鸭子,那么我们就可以把它当作鸭子。

换句话说,在使用对象时,不关注对象的类型,而是关注对象是否具有所需的方法和属性。只要对象具有所需的方法和属性,就可以在相应的上下文中使用,而不管它具体属于哪个类。

例如,如果有两个类 Bird 和 Plane ,它们都有一个 fly 方法。

class Bird:def fly(self):print("Bird is flying")class Plane:def fly(self):print("Plane is flying")def make_fly(obj):obj.fly()

在某个函数中,如果需要一个能够“飞行”的对象,我们可以接受这两个类的实例,因为它们都具有 fly 方法,符合“能够飞行”的要求。

bird = Bird()
# 创建了一个 `Bird` 类的实例 `bird`plane = Plane()
# 创建了一个 `Plane` 类的实例 `plane`make_fly(bird)
# 调用 `make_fly` 函数,并将 `bird` 作为参数传递进去
# 在函数内部,通过 `obj.fly()` 调用了 `Bird` 类中定义的 `fly` 方法,输出 "Bird is flying"make_fly(plane)
# 调用 `make_fly` 函数,并将 `plane` 作为参数传递进去
# 在函数内部,通过 `obj.fly()` 调用了 `Plane` 类中定义的 `fly` 方法,输出 "Plane is flying"

 这种编程风格强调的是对象的行为,而不是对象的类型,使得代码更加灵活和可扩展。

鸭子类型示例:

#鸭子类型:长得像鸭子,它就是鸭子类型#多个类中实现了同一个方法(当前的方法名一样)
class Cat:def say(self):print('I am a cat')class Dog:def say(self):print('I am a dog')class Duck:def say(self):print('I am a duck')animal = Cat
animal().say()animal = Dog
animal().say()#输出:I am a cat
I am a dog#这也是一种多态的体现

http://www.lryc.cn/news/394810.html

相关文章:

  • 001uboot体验
  • Flask之电子邮件
  • Vue 2 与 ECharts:结合使用实现动态数据可视化
  • .net core Redis 使用有序集合实现延迟队列
  • linux 安装Openjdk1.8
  • 鸿蒙系统:未来智能生态的引领者
  • Java语言程序设计——篇二(1)
  • 水果商城系统 SpringBoot+Vue
  • 半导体制造企业 文件共享存储应用
  • 深入分析 Android BroadcastReceiver (九)
  • 从数据到洞察:DataOps加速AI模型开发的秘密实践大公开!
  • 全景图三维3D模型VR全景上传展示H5开发
  • 前端面试题29(js闭包和主要用途)
  • 使用Keil 点亮LED灯 F103ZET6
  • 流批一体计算引擎-12-[Flink]旁路输出getSideOutput(OutputTag)实现拆分流和复制流
  • 【Scrapy】 Scrapy 爬虫框架
  • 【笔记】太久不用redis忘记怎么后台登陆了
  • 昇思25天打卡营-mindspore-ML- Day14-VisionTransformer图像分类
  • 微信环境内H5网页,用开放标签wx-open-launch-app打开app
  • 【c++基础】高精度数不进位加法
  • UniApp 中 Web/H5 正确使用反向代理解决跨域问题
  • Redis Stream:实时数据流的处理与存储
  • 【论文阅读】-- Visual Traffic Jam Analysis Based on Trajectory Data
  • 修改编译依赖openssl的libcrypto.so
  • ����: �Ҳ������޷��������� javafx.fxml ԭ��: java.lang.ClassNotFoundException解决方法
  • 【C++】———— 继承
  • Python人生重开器
  • python 高级技巧 0708
  • HOW - React Router v6.x Feature 实践(react-router-dom)
  • `padding`、`border`、`width`、`height` 和 `display` 这些 CSS 属性的作用