python 对多态的深层次理解

本文详细介绍了Python中的多态性概念,强调了继承和重写作为实现多态的前提。通过代码示例展示了如何在子类中重写父类方法,以及多态在实际编程中的应用,如在IceCream类中调用不同口味冰淇淋的make方法。此外,还探讨了多态在支付场景中的体现,通过Wechatpay和Alipay类展示了如何使用同一函数调用不同功能。
摘要由CSDN通过智能技术生成

前言:
多态的实现必须满足两个前提条件
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 = Wechatpay("xiaohong", 100)

pay(ali)
pay(wch)

结果
xiaoming通过支付宝支付了100元
xiaohong通过微信支付了100
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值