Python中的多态如何理解?(转帖,让我很理解。)【外加自我看法】(这次修改后应该就是标准答案了)
置顶写一些我自己的看法,根据Python基础教程的写法:多态指的是能够同样的对待不同的类型和类的对象,既无需知道对象属于哪个类就可以调用的方法。
好比.clear的方法,你给一个列表与字典都能调用该方法。
向.count可以给字符串,列表,元祖,都能用,这个方法就是多态的,
你没发现,同一个函数用了可以针对不同的类型进行操作。比价疑惑的是,无需知道对象是哪个类那句话,其实这些方法我们是知道哪个类的,
不知哪个类,还真不敢乱用,我觉的字面上的无需知道哪个类的意思,可能这些方法在自己的操作类型范围内,不需要知道是哪个类的意思。
比如前面.count你不需要知道是列表,元祖还是字符串,来了就上方法就好了,不需要isinstance或type判断,会让程序看过去更加简单,清爽
以上是我的理解。
今天又重新看了书,有了更加深刻的理解,多态其实还是因为有继承的关系,我们所有的实例的类的祖宗类都是object,下面的任何实例对象的类都是它子孙后代。
其实很多文献翻译中,翻译的不好,一直就说不用取关心对象的具体类型,上去就能使用具体方法或者函数(调用的最后还是魔法方法)。
正常的情况应该是在限定的集中范围内,你使用某一个方法或者函数(调用的最后还是魔法方法),不用考虑它的具体类型。
好比前面写的.count在字符串与列表,元祖之间使用,你根本不用考虑使用之前它是什么类型的元素。
这个时候书中就说了一个大招。repr,repr最后调用的应该是__repr__函数,但它使用中,基本可以说完全不考虑来的对象是什么,只要是python里面合法的对象。
上来就给你套一个双引号。
这才是正真的多态含义,多态最后面说的是方法,很多国内的书写的乱七八糟,还自创了什么多态性,我操,这还出书误人子弟。
看来很多东西还是要慢慢体会,关于多态,我查了很多国内的资料,基本都是乱说,国外的英文看不懂。
但我感觉我的这次理解100%正确,这是结合我一年的学习外加图灵《Python基础教程》书中解释。(这书还可以,新手不推荐,有一定基础再看,收益匪浅)
Python中多态的作用
让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容(功能)的函数。
Python中多态的特点
1、只关心对象的实例方法是否同名,不关心对象所属的类型;
2、对象所属的类之间,继承关系可有可无;
3、多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
4、多态是调用方法的技巧,不会影响到类的内部设计。
多态的应用场景
1. 对象所属的类之间没有继承关系
调用同一个函数fly(), 传入不同的参数(对象),可以达成不同的功能
class Duck(object): # 鸭子类
def fly(self):
print("鸭子沿着地面飞起来了")
class Swan(object): # 天鹅类
def fly(self):
print("天鹅在空中翱翔")
class Plane(object): # 飞机类
def fly(self):
print("飞机隆隆地起飞了")
def fly(obj): # 实现飞的功能函数
obj.fly()
duck = Duck()
fly(duck)
swan = Swan()
fly(swan)
plane = Plane()
fly(plane)
===运行结果:===================================================================================
鸭子沿着地面飞起来了
天鹅在空中翱翔
飞机隆隆地起飞了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2. 对象所属的类之间有继承关系(应用更广)
class gradapa(object):
def __init__(self,money):
self.money = money
def p(self):
print("this is gradapa")
class father(gradapa):
def __init__(self,money,job):
super().__init__(money)
self.job = job
def p(self):
print("this is father,我重写了父类的方法")
class mother(gradapa):
def __init__(self, money, job):
super().__init__(money)
self.job = job
def p(self):
print("this is mother,我重写了父类的方法")
return 100
#定义一个函数,函数调用类中的p()方法
def fc(obj):
obj.p()
gradapa1 = gradapa(3000)
father1 = father(2000,"工人")
mother1 = mother(1000,"老师")
fc(gradapa1) #这里的多态性体现是向同一个函数,传递不同参数后,可以实现不同功能.
fc(father1)
print(fc(mother1))
===运行结果:===================================================================================
this is gradapa
this is father,我重写了父类的方法
this is mother,我重写了父类的方法
100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
————————————————
版权声明:本文为CSDN博主「tigerlib」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44695969/article/details/92175840