前言:
多态的实现必须满足两个前提条件
- 1.继承:多态一定是发生在子类和父类之间
- 2.重写:多态子类重写了父类的方法
记住这两点再结合代码示例有助于理解多态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#多态的代码实例 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方法,这就是多态性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 多态的应用 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并不在乎!
总结一句话就是:多态中不同的子类对象调用相同的父类方法,会产生不同的执行结果
这里的多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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多态理解的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/weixin_47906106/article/details/118485666