Python21基础 多态性
2021-03-23 13:25
标签:面向对象 判断 是什么 color 执行 简单 重写 class 而不是 Python21基础 多态性 标签:面向对象 判断 是什么 color 执行 简单 重写 class 而不是 原文地址:https://www.cnblogs.com/ljh-study/p/13846470.html 1 #多态性
2
3 #多态的概念
4 #发生多态的两个前提条件
5 # 1.继承,多态一定发生在父类与子类之间
6 # 2.重写,子类重写父类的方法
7 #简单来说
8 #多态就是在多个子类继承了同一个父类后
9 #重构父类的方法,然后同样的方法在不同类中存在不同的形式
10 #这就是多态
11
12 class animals(object):
13 def put_s(self):
14 print("动物")
15
16 class dog(animals):
17 def put_s(self):
18 print("狗哥")
19
20 class cat(animals):
21 def put_s(self):
22 print("猫哥")
23
24 a1=animals()
25 a2=dog()
26 a3=cat()
27
28 a1.put_s()
29 a2.put_s()
30 a3.put_s()
31 #这里调用了方法put_s,但是三个方法输出结果都是不一样的
32 #这里就存在多态
33
34 #一般来讲,Python是动态面向对象语言,多态的意义不是像Java静态语言那样重要
35
36 print("//////////////////////////////")
37
38 #类型检查
39 #其实不论多态对Python来说有多重要
40 #多态总是存在
41 #这里我们可以对其进行检查
42 #通过使用isinstance(object,classinfo)函数来检查
43 # isinstance(object,classinfo)中
44 # 是检查object实例,注意,object是实例!!!!!!
45 # 是否由classinfo类或者其子类创造
46
47 #依然拿上面的三个类做例子
48 ‘‘‘
49 class animals(object):
50 def put_s(self):
51 print("动物")
52
53 class dog(animals):
54 def put_s(self):
55 print("狗哥")
56
57 class cat(animals):
58 def put_s(self):
59 print("猫哥")
60
61 a1=animals()
62 a2=dog()
63 a3=cat()
64
65 ‘‘‘
66 print(isinstance(a1,dog))
67 #判断,a1实例是不是由dog类创造
68 print(isinstance(a2,dog))
69 #判断,a2实例是不是由dog类创造
70 print(isinstance(a3,dog))
71 #判断,a3实例是不是由dog类创造
72 print(isinstance(a3,animals))
73 #判断,a3实例是不是由animals类创造
74
75 #尝试
76 #在写isinstance(obj,class_or_tuple)
77 #我们发现函数说明中显示可以用来检测元组
78 #于是我们尝试一下
79
80 t1=(0,1,2,3,4)
81 #print(isinstance(2,t1))
82 #报错,原因是2是int而不是一个实例
83 t2=2
84 #print(isinstance(t2,t1))
85 #isinstance() arg 2 must be a type or tuple of types
86 #任然报错
87 #这里的她t2依然是以int类型存在
88
89 #换一种思路,就是元组里面可以存放类吗?
90 t3=(animals,dog,cat)
91 #编译运行可以的
92 print(isinstance(a2,t3))
93 # 判断dog()实例a2是不是在这这个元组中的三个不同类或者其子类创造
94
95 print("//////////////////////////////////")
96
97 #鸭子类型
98 #""一只鸟,走起来像鸭子,游起来像鸭子,那他就是一只鸭子""
99 #简单来说,鸭子类型不在乎变量的类型,只在乎变量所具有的方法
100 #鸭子类型像多态一样工作,但是没有继承,只有像鸭子一样的行为,就是方法
101
102 #还是拿上面的三个类举例子
103 ‘‘‘
104 class animals(object):
105 def put_s(self):
106 print("动物")
107
108 class dog(animals):
109 def put_s(self):
110 print("狗哥")
111
112 class cat(animals):
113 def put_s(self):
114 print("猫哥")
115
116 a1=animals()
117 a2=dog()
118 a3=cat()
119
120 ‘‘‘
121 #定义一个鸭子类型
122 def duck(sth): #接收一个数据
123 #不论是什么类型的
124 sth.put_s()
125 #直接执行这个数据的方法
126 #这说明只要满足
127 #就会执行,不用去考虑是不是继承形成多态
128
129 duck(animals())
130 duck(dog())
131 duck(cat())
132
133 print("///////////////////////////")