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

标签:Python,多态
0
投稿

猜你喜欢

  • Go Slice进行参数传递如何实现详解

    2024-02-16 13:07:46
  • Mootools 1.2教程(15)——滚动条(Slider)

    2008-12-09 17:35:00
  • 教你轻松掌握如何保护MySQL中的重要数据

    2008-12-19 17:42:00
  • Python实现提取音乐频谱的方法详解

    2022-01-27 07:03:08
  • numpy中的norm()函数求范数实例

    2022-01-02 01:36:45
  • 浅谈go中defer的一个隐藏功能

    2024-04-28 09:13:07
  • python3.6.3+opencv3.3.0实现动态人脸捕获

    2022-12-21 11:59:41
  • Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]

    2023-03-13 09:20:52
  • 详解PyTorch手写数字识别(MNIST数据集)

    2023-01-28 19:40:47
  • Python中的字符串类型基本知识学习教程

    2023-03-29 01:48:47
  • python geopandas读取、创建shapefile文件的方法

    2022-09-23 16:57:19
  • 原生js实现查找/添加/删除/指定元素的class

    2024-04-18 09:44:46
  • 基于laravel缓冲cache的用法详解

    2024-05-11 10:07:55
  • Python 线程池模块之多线程操作代码

    2022-06-14 06:01:47
  • python tkinter实现界面切换的示例代码

    2023-12-29 15:54:35
  • Go与C语言的互操作实现

    2024-02-04 08:39:28
  • Request.ServerVariables("HTTP_REFERER")的用法

    2008-06-19 13:33:00
  • Python3 log10()函数简单用法

    2021-06-27 16:47:16
  • JavaScript数组合并的8种常见方法小结

    2024-04-16 09:32:55
  • python Django 创建应用过程图示详解

    2022-10-29 03:04:40
  • asp之家 网络编程 m.aspxhome.com