新闻动态

Python教程之Python多态的深层次理解

发布日期:2022-01-04 16:30 | 文章来源:脚本之家


多态的实现必须满足两个前提条件

  • 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)

以上就是Python教程之Python多态的深层次理解的详细内容,更多关于Python多态理解的资料请关注本站其它相关文章!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部