Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

多态

原创
作者头像
Heaven645
发布于 2024-08-07 11:24:14
发布于 2024-08-07 11:24:14
12600
代码可运行
举报
文章被收录于专栏:Python学习Python学习
运行总次数:0
代码可运行

前言

多态(Polymorphism)是面向对象编程中的核心概念,本章将详细讲解 Python 中多态的实现方式以及如何应用多态提高代码的可维护性。


本篇文章参考:黑马程序员

一、基本概念

定义:

多态是指同一个行为通过不同的对象获得不同的结果或状态。

类型:

①鸭子类型(Duck Typing)

在 Python 中,我们不关注对象的具体类型,只关注对象是否具有某个方法或属性。如果一个对象能“像鸭子一样叫,像鸭子一样走”,那么即使它不是一个鸭子,Python 也能通过该对象执行操作。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Bird:  
    def fly(self):  
        return "I can fly!"  

class Airplane:  
    def fly(self):  
        return "I am an airplane!"  

class Fish:  
    def swim(self):  
        return "I can swim!"  

def lets_fly(thing):  
    print(thing.fly())  

# 使用鸭子类型  
bird = Bird()  
airplane = Airplane()  

lets_fly(bird)      # 输出: I can fly!  
lets_fly(airplane)  # 输出: I am an airplane!  
# lets_fly(Fish())  # 会出错,因为 Fish 类没有 fly 方法

输出结果:

I can fly!

I am an airplane!

【分析】

lets_fly() 函数期望传入一个具有 fly() 方法的对象。Bird 和 Airplane 类都实现了 fly() 方法,因此它们可以作为参数传递给 lets_fly()。由于Fish 没有 fly() 方法,如果 Fish 被传入,程序运行后会报错。

②方法重写(Method Overriding)

子类可重写父类的方法,以实现不同的功能。当通过父类调用这个方法时,会调用子类的实现。

思考:那我们前两章讲到的继承的复写和多态的方法重写有什么区别呢?

答:在 Python 中,继承中的复写(通常指方法重写)和多态中的方法重写实际上是同一个概念,都是指在子类中重写父类的方法,但其上下文和侧重点有所不同。

在继承关系中,子类重写父类的方法,目的是给该方法提供不同的实现,以满足子类的特定需求。这是一种语言级别的概念,侧重于代码的结构和重用。

而多态中的"方法重写"更广泛地应用于设计模式,它关注的是运行时的行为选择,强调的是基于接口而不是固定实现,允许根据实际使用的对象类型动态地调用相应的方法。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Animal:
    def speak(self):
        pass

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

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

def make_noise(animal: Animal):
    # 制造噪音,需要传入Animal对象
    animal.speak()

# 使用两个子类对象调用函数
dog = Dog()
cat = Cat()

make_noise(dog)
make_noise(cat)

输出结果:

汪汪汪

喵喵喵

【分析】

父类 Animal 定义了一个方法 speak(),而子类 Dog 和 Cat 重写了该方法,提供各自特定的实现。函数 make_noise() 接受一个 Animal 类型的参数,它可以接受任何 Animal 的子类实例(如 Dog 或 Cat)。这是因为子类是父类的特例,Dog 和 Cat 类是对 Animal 的扩展,因此任何 Dog 或 Cat 的实例都可以被视为 Animal 的实例。

多态常用于继承关系中,允许以父类进行定义和声明,而以子类实现具体功能,从而实现相同的行为但具有不同的状态。

例如,当一个函数的参数声明为父类对象时,实际上可以传入其子类的对象来执行相应的操作,这使得我们能够通过统一的接口来处理不同类型的对象,从而实现灵活的代码设计。

异同点:

特征

鸭子类型

方法重写

定义

一种类型的特性通过行为来判断,而不是类型本身

在子类中重写父类的方法以提供不同的实现

实现方式

只需实现所需的方法

明确使用继承结构,子类根据需要重写父类方法

灵活性

高(适用于任何对象只要实现了必要的方法)

略低(依赖于类的继承关系)

关注点

强调对象行为而非类型

强调屏蔽父类的具体实现,提供自定义实现

使用场景

适合处理不同类型的对象,只要它们实现了同样的方法

适合在继承关系中有明确父子类关系的场景

二、抽象类

抽象类:包含抽象方法的类。

抽象方法:没有具体实现的方法

这种设计的意义在于父类定义了应包含的方法,而具体的实现则由子类负责决定。

例如,空调可以制冷、制热和左右扫风。我们将这三个功能制定为空调制造的标准,不同的厂家必须根据这个标准各自实现功能。抽象类可以看作是这种标准,它包含了一些抽象方法,要求子类必须实现这些方法。

这种设计的作用主要体现在以下几个方面:

  • 顶层设计:抽象类提供了一个设计标准,以便子类进行具体实。
  • 软性约束:抽象类对子类施加了一种约束,要求子类必须重写(实现)父类的一些方法。
  • 配合多态:通过多态的机制,我们可以获得不同的工作状态。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 抽象类
class AC:
    # 制冷
    def cool_wind(self):
        pass

    # 制热
    def hot_wind(self):
        pass

    # 左右摆风
    def swing_l_r(self):
        pass


class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调制冷")

    def hot_wind(self):
        print("美的空调制热")

    def swing_l_r(self):
        print("美的空调左右摆风")

class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调制冷")

    def hot_wind(self):
        print("格力空调制热")

    def swing_l_r(self):
        print("格力空调左右摆风")

def make_cool(ac: AC):
    ac.cool_wind()

midea_ac = Midea_AC()
gree_ac = GREE_AC()

make_cool(midea_ac)
make_cool(gree_ac)

输出结果:

美的空调制冷

格力空调制冷

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度│数据已然成为服装企业未来的“通关”密码,这项技能你get了吗?
企鹅号小编
2017/12/27
9080
深度│数据已然成为服装企业未来的“通关”密码,这项技能你get了吗?
行业 | 服装行业+小程序的秘密只有少数人知道
近年来,国内服装行业销售的持续下滑已成为既定事实。据不完全统计,美特斯邦威在三年内关闭了1600家门店;李宁在三年内关闭了近1800家店铺;过去几年,波司登已将店铺数量减少了8000多家......
极客小程序分享
2018/12/06
1.7K0
行业 | 服装行业+小程序的秘密只有少数人知道
服装服饰行业电子商务商城数智化营销解决方案
中国古代开始便有“男耕女织”的概念,中国服装业拥有悠久的历史传承。随着我国近年来的互联网电商发展,传统的服装销售渠道被颠覆,从原来的线下店面消费转向选择通过电商平台来完成服装的购买。
数商云网络科技
2022/04/08
6840
服装服饰行业电子商务商城数智化营销解决方案
从服装供应链看产业互联网的机会
中国服装产业在过去30年经历了高速增长-库存积压-存货出清-重新增长的几个周期,现今,产业各环节迎来新的机会与挑战。
张哥编程
2024/12/19
1160
从服装供应链看产业互联网的机会
纺织服装S2B2C新零售平台拓宽传统销售渠道,提高企业运营效率
纺织服装,即经纺织加工而成的服饰产品。近年来,我国纺织服装市场整体发展趋势良好,随着数字经济时代的到来,我国纺织服装产业转型发展也形成了新的商业格局,电商平台已成为推动纺织服装行业转型升级的重要力量。
数商云
2022/02/16
6030
纺织服装S2B2C新零售平台拓宽传统销售渠道,提高企业运营效率
数字化 | 制造业转型的十个方向详细探索
互联网对商业环节的渗透和改造是逆向的,从与消费者最近的广告营销端开始,进入零售、渗透进分销环节,最终倒逼到生产制造环节,在此过程中生产方式、管理理念、生产设备、甚至原材料都将发生重大变化。关于互联网+制造业会发生什么样的变革?传统制造业企业如何拥抱互联网倒逼的变革?笔者基于制造业经典理论和产业边缘发生的变革端倪,总结分析,与业内人士共同探讨。
CloudBest
2020/08/28
7260
数字化 | 制造业转型的十个方向详细探索
从O2O到S2B2C电商 ,零售转型的商业模式创新
未来五到十年对人类影响最重要的三大科技突破,所带来的本质改变指向了一点:新技术对原来商业模式的改变。
数商云网络科技
2021/08/17
1.1K0
传统企业互联网转型的四重境界
传统企业的互联网转型,大致会经历如下四个阶段,或者说四重境界(如下图)。在经历了传播互联网化、渠道互联网化和供应链互联网化之后,必然要经历整个经营逻辑的互联网化。也只有完成了整个经营逻辑的互联网化,才
用户1756920
2018/06/20
9450
纺织服装行业供应链集采管理平台推进采购业务数字化,实现集采协同系统智能互联
纺织服装是中国国民经济的传统支柱产业和重要的民生产业,纺织服装产业的发展直接关系到社会的稳定以及经济的可持续发展,近年来,受劳动力成本上升、需求低迷、中美贸易摩擦等多重因素影响,中国纺织服装产业增速不断放缓,下行压力加大,纺织服装产业供应链转型升级变得至关重要。
数商云
2022/01/12
5910
纺织服装行业供应链集采管理平台推进采购业务数字化,实现集采协同系统智能互联
服装企业遭受经济重创,企业如何击破困境迎来暖春
据一份来源于服装供应商及其贸易协会的报告指出,从三月份开始,众多大型的欧美时装品牌和公司,因疫情取消订单或拒绝支付疫情前所下达的订单,导致4~6月全球服装工厂和供应商的亏损达到了162亿美元。受到冲击的供应商也因此不得不缩小经营规模,甚至直接关门。
数商云市场营销总监
2021/05/08
3870
服装撞上AI,美图、云快反、SHEIN“枕戈待旦”
过去几年,国潮风口带动了汉服、马面裙、旗袍等等不少“新中式”服装的兴盛,有的商家借此契机赚了个盆满钵满,也有的商家苦于追不上风口。
刘旷
2024/04/22
1890
2018年工业互联网加速落地,互联网如何智造中国?
互联网正在变得越来越“重”,不只是从线上走到线下,而是在从“比特世界”深入到“原子世界”,工业互联网的兴起,更是让互联网从“轻公司”成为名副其实的“重工业”。
罗超频道
2018/07/23
4450
2018年工业互联网加速落地,互联网如何智造中国?
“互联网+”时代,传统批发行业如何重构商业模式?
批发业是指批发商向批发、零售单位及其他企业、事业、机关批量销售生活用品和生产资料的活动,以及从事进出口贸易和贸易经纪与代理的活动。
数商云
2021/12/17
1.4K0
“互联网+”时代,传统批发行业如何重构商业模式?
“服装行业”凉凉了?如何利用小程序扭转乾坤?
大家都知道传统的线下企业已经非常难做,而服装行业作为传统行业的代表,受到的冲击更大。这几年,各大知名服装品牌也纷纷掀起「关店潮」。
微盛企微管家
2018/09/07
7010
“服装行业”凉凉了?如何利用小程序扭转乾坤?
服装行业数字化转型解决方案
中国是全世界最大的服装消费国和生产国,服装业的发展大大推动了中国国民经济的发展,而服装行业的SKU多,人力难以实现精细化管理的情况,使越来越多的服装企业意识到,独立地进行生产和销售己经不能适应快速发展的市场和不断变化的顾客需求,保持长远竞争优势的关键在于战略伙伴关系的建立,形成一条从供应商到制造商再到分销商和零售商的贯穿所有企业的供应链,通过优势互补来获得整体竞争优势,才能达到双赢的目的。
数商云市场营销总监
2021/05/24
1.5K0
学习笔记 | 传统企业互联网改革之道
最近在看刘润老师的《互联网+战略版:传统企业,互联网在踢门》,学习了传统企业互联网改革的价值模型与三大模式,醍醐灌顶受益良多。因此,我将我学到的总结下来成文,分享与你。
Edison Zhou
2020/11/25
6310
学习笔记 | 传统企业互联网改革之道
建材业内忧外患的局面,如何利用互联网实现产业升级再造?
“产业互联网”是2018年产业圈中的讨论热词,并炸响了不少的实业企业家的心,其中少不了建材业的大佬们。建材也属于我国发展较为长久的行业,谈到互联网升级再造,实实在在难倒不少建材企业,实际存在的问题有许多,核心还是基于供应链本身,从制造、流通端,包括现在提的新零售、销售终端的变革,受到非常大的冲击。建材行业本身销售通过主要有两块:一是工程领域,近年工程领域面临着政策、环境对房地产的影响,进而不同细分市场的建材厂家都受到冲击;二是零售角度,零售型建材就数家装行业最落地,家装行业也因互联网冲击发生了巨大的变化。
数商云市场营销总监
2021/03/16
3160
纺织服装行业电子采购管理平台科学评估供应商绩效,增加采购透明度
中国纺织服装领域拥有着数万亿级市场空间且较为分散的庞大赛道,但纺织服装产业从生产到流通到零售的各个环节都痛点丛生。
数商云市场营销总监
2022/04/06
4300
腾讯汤道生 :产业互联网数字化进程的三个关键词
近日,《产业互联网的中国路径》正式出版。 本书由腾讯公司高级执行副总裁、云与智慧产业事业群总裁汤道生,清华大学经管学院教授朱恒源共同编著,他们以“清华+腾讯”的产学组合破题未来新经济,从“产业互联网”的视角探讨了中国产业的智能化跃迁路径,以及新产业秩序形成可能遇到原有产业格局的阻滞和挑战。 “这是腾讯第一本产业互联网相关的专业书籍,把过去两年转型的实践经验、案例进行系统梳理与总结。”汤道生表示,产业互联网是一个创新与创造的时代,腾讯希望通过这本书,和行业一起共同探索未来,期望能给行业的数字化转型升级带
腾讯企点
2020/09/10
5120
可交易外,产业互联网平台如何数字化“蝶变”?
当前,全球创新格局发生深刻复杂的变化,以数字化、网络化、智能化为特征的产业互联网平台成为数字经济发展的重要方向,也成为推动产业数字化转型升级和经济高质量发展的重要业态。
华世界产业数字研究院
2021/11/10
5610
可交易外,产业互联网平台如何数字化“蝶变”?
推荐阅读
相关推荐
深度│数据已然成为服装企业未来的“通关”密码,这项技能你get了吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验