Python教程之Python多态的深层次理解
作者:季布, 发布时间:2021-07-30 07:50:53
前言:
多态的实现必须满足两个前提条件
1.继承:多态一定是发生在子类和父类之间
2.重写:多态子类重写了父类的方法
记住这两点再结合代码示例有助于理解多态
#多态的代码实例
class Farther:
def behavior(self,action):
print("父亲会%s" % action)
# 定义Son类继承Farther类
class Son(Farther):
def behavior(self,action):
print("儿子会%s" % action)
# 定义Grandson类继承Farther类
class Grandson(Farther):
def behavior(self,action):
print("孙子会%s" % action)
# 使用Farter类创建对象
# 程序在执行时才会确定behavior方法是属于哪一个对象的
f = Farther()
print(id(f))
f.behavior("吃饭") #父亲会吃饭
f = Son()
print(id(f))
f.behavior("吃饭") #儿子会吃饭
f = Grandson()
print(id(f))
f.behavior("吃饭") #孙子会吃饭
运行结果:
1603040478928
父亲会吃饭
1603040477584
孙子会吃饭
1603040478928
儿子会吃饭
从以上代码示例可以看出,Son,Grandson这两个子类都继承了Farther类,且都重写了父类中的behavior方法;由此结果可见,同一个对象调用同一个(参数,函数名完全相同)behavior方法时,由于f指向的的实例对象不同,程序在实际运行时调用的并不是同一个behavior()方法,代码会自动根据p的具体对象来决定执行哪个behavior方法,这就是多态性
# 多态的应用
class IceCream:
def make_icecream(self,taste):
print("寻找不同口味的冰淇淋...")
taste.make(self)
# 定义抹茶味的冰淇淋和方法
class Tea:
def make(self,make_icecream):
print('%s 正在调用抹茶的制作方法' % make_icecream)
class Orange:
def make(self,make_icecream):
print('%s 正在调用抹茶的制作方法' % make_icecream)
class Apple:
def make(self,make_icecream):
print('%s 正在调用抹茶的制作方法' % make_icecream)
i = IceCream()
# 抹茶味
i.make_icecream(Tea())
# 橘子味
i.make_icecream(Orange())
#苹果味
i.make_icecream(Apple())
# 执行结果
寻找不同口味的冰淇淋...
<__main__.IceCream object at 0x000002700CF086D0> 正在调用抹茶的制作方法
寻找不同口味的冰淇淋...
<__main__.IceCream object at 0x000002700CF086D0> 正在调用抹茶的制作方法
寻找不同口味的冰淇淋...
<__main__.IceCream object at 0x000002700CF086D0> 正在调用抹茶的制作方法
解析:
从上述代码可见,在调用IceCream类的make_icecream()方法时,程序并不关心为该方法传入的参数对象taste是谁,只要求此参数对象taste包含make()方法即可,而调用者传入的参数对象类型taste是子类还是其他类,Python并不在乎!
总结一句话就是:多态中不同的子类对象调用相同的父类方法,会产生不同的执行结果
这里的多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
class Wechatpay:
def __init__(self, name, money):
self.name = name
self.money = money
def pay(self):
print('%s通过微信支付了%s元' % (self.name, self.money))
class Alipay:
def __init__(self, name, money):
self.name = name
self.money = money
def pay(self):
print('%s通过支付宝支付了%s元' % (self.name, self.money))
#这里的多态性体现是向同一个函数,传递不同参数后,可以实现不同功能.
def pay(person):
person.pay()
# 实列化对象
ali = Alipay("xiaoming", 100)
wch = Alipay("xiaohong", 100)
pay(ali)
pay(wch)
来源:https://blog.csdn.net/weixin_47906106/article/details/118485666


猜你喜欢
- 在移动社交时代,微信已经成为我们生活不可或缺的一部分。2017年的《微信数据报告》中显示:每天有380亿条消息从微信上发出,其中6亿条是语音
- pyenv简单介绍在日常运维中, 经常遇到这样的情况: 系统自带的Python是2.x,而业务部署需要Python 3.x 环境, 此时需要
- 前言在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的。由于Node.js独特的异步特性,才出现了“回调地狱”的问题,这篇文章
- 前言最近在做项目的时候遇到一个问题,需要获取一个动态预览的图片的地址,这其实不是什么问题,主要是该图片的路径是写在css的backgroun
- 对于golang, 交换两个数很简单,如下这么写就可以了:i, j = j, i等号左边和右边含有多个表达式,这就是平行赋值。 赋值分为两个
- 阐述写SQL时本想通过 A left B join on and 后面的条件查出的两条记录变成一条,奈何发现还是有两条。后来发现 join
- 本文实例为大家分享了python实现坦克大战游戏的具体代码,供大家参考,具体内容如下游戏界面pygame游戏引擎的安装pip安装window
- python的多重继承的理解Python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照
- 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>
- package dao;import org.hibernate.HibernateException;import org.hiberna
- context 有什么作用context 主要用来在goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。
- 疫情终于有所好转了,感谢所有的为之奋斗的白衣天使们,你们是最棒的!赞!白衣天使们在前线奋战,我们也总不能总在家里躺着做贡献,也要加强学习,争
- NMAP是一款开源的网络探测和安全审核的工具,他能够快速的扫描出某个服务器对外暴露的端口信息。是在安全测试领域很常见的一个工具。今天我们用p
- 在设计主键的时候往往需要考虑以下几点: 1.无意义性:此处无意义是从用户的角度来定义的。这种无意义在一定程度上也会减少数据库的信息冗余。常常
- 一、Beautiful Soup概述:Beautiful Soup支持从HTML或XML文件中提取数据的Python库;它支持Python标
- sqlite3 - SQLite 数据库SQLite 是一款轻量级、无需安装、零配置的嵌入式关系数据库。Python 自带 sql
- 一个不错的二级联动下拉菜单源码,您一定会用得到的。运行代码:<html><head><title>Lis
- 原型图:项目需求:服务器接受到报警后将消息推送到前台,(通过前端实时消息提示的效果-websocket长轮询),前台接受到消息后需要发出警报
- It's well-known.Microsoft SQL Server 7.0增加了一个语句top,可以限制返回的记录数。但是在使
- 背景:有一个list,里面的每一个元素都是dict,根据某一个key进行去重,在这里,key代表question#!/usr/bin/env