Python20基础 继承性

这个我多继

  1 #面向对象编程
  2 
  3 #继承性
  4 class Theshy (object):
  5     def __init__(self,types,space):
  6         self.types=types
  7         self.space=space
  8     def info(self):
  9         s="操作风格 :{0}\n擅长位置{1}\n".format(self.types,self.space)
 10         return s
 11 
 12 '''
 13 class wo (object):
 14     def __init__(self,types,space,words):
 15         self.types=types
 16         self.space=space
 17         self.words=words
 18 
 19 '''
 20 
 21 #这样我们就建立了两个不同的类
 22 #但是这两个类基本上是完全一直的
 23 #写两个太麻烦了
 24 #我们就可以通过继承关系来简化类的内容
 25 #重新定义wo类
 26 class wo (Theshy):
 27     def __init__(self,types,space,words):
 28         #super.__init__(self,types,space)
 29         #super().__init__(self,types,space)
 30         super().__init__(types,space)
 31         self.words=words
 32     def info(self):
 33         s="操作风格 :{0}\n擅长位置{1}\n".format(self.types,self.space)
 34         return s
 35 
 36 shy=Theshy("别吃","上单")
 37 print(shy.info())
 38 
 39 #I=wo()
 40 #TypeError: __init__() missing 3 required positional arguments: 'types', 'space', and 'words'
 41 #直接报错
 42 #是因为这里的super.__init__代替的是
 43 #self.types=types
 44 #self.space=space
 45 #而不是传输的父类中的数据
 46 #所以我们任然要手动的输入数据
 47 #I=wo("混子","上单","就离谱")
 48 #TypeError: descriptor '__init__' requires a 'super' object but received a 'wo'
 49 #出错原因是上面的super是方法,需要加上()才可运行
 50 #在修改完后继续运行
 51 #I=wo("混子","上单","就离谱")
 52 #TypeError: __init__() takes 3 positional arguments but 4 were given
 53 #还是报错
 54 #原因是super().__init__这里init的()中不用加上self了!
 55 I=wo("混子","上单","就离谱")
 56 print(I.info())
 57 #这样我们就成功使用了父类Theshy中间的数据
 58 #就减轻了负担,提高了代码的重复利用率
 59 
 60 #我们再尝试调用一下Theshy中的info函数
 61 
 62 class wo_2 (Theshy):
 63     def __init__(self,types,space,words):
 64         super().__init__(types,space)
 65         self.words=words
 66     def info(self):
 67         super().info()
 68         j="名台词:{0}".format(self.words)
 69         return j
 70 
 71 II=wo_2("混子","上单","就离谱")
 72 print(II.info())
 73 #这里我们发现
 74 #输出结果是words的"就离谱"
 75 #这说明在父类中的info中的最后一句return s 并没有被带过来
 76 
 77 class wo_3 (Theshy):
 78     def __init__(self,types,space,words):
 79         super().__init__(types,space)
 80         self.words=words
 81     def info(self):
 82         s=super().info()
 83         #现在我们知道了
 84         #这里的super().info()传输过来的是
 85         #"操作风格 :{0}\n擅长位置{1}\n".format(self.types,self.space)
 86         j="名台词:{0}".format(self.words)
 87         #return j+s
 88         #这里直接报错说没有s变量
 89         #现在我们在上面建立一个s
 90         #就可以了
 91         return j+s
 92 
 93 III=wo_3("混子","上单","就离谱")
 94 print(III.info())
 95 
 96 class wo_4 (Theshy):
 97     def __init__(self,types,space,words):
 98         super().__init__(types,space)
 99         self.words=words
100     def info(self):        
101         #Theshy.info()
102         #TypeError: info() missing 1 required positional argument: 'self'
103         #只填写一个Theshy.info()后的报错结果
104               
105         #s=Theshy().info()
106         #TypeError: __init__() missing 2 required positional arguments: 'types' and 'space'
107         #修改后依然有问题,它显示缺少了两个数据types和space
108 
109         s=Theshy("混子","上单").info()
110         #这样就没有报错了
111         #但是这里相当于是在子类中定义了一个Theshy类的实例s
112         #多此一举了
113         j="\n名台词:{0}".format(self.words)
114         
115         #return s+j
116         #这里虽然写的是s+j
117         #但是返还值还是j的
118         #仔细看会发现j现在是str
119         #但是s却是s:str
120         
121         #return s
122         #如果我们直接写s就返还的是s中的数据
123 
124         #return "{0}{1}".format(s,j)
125         #任然没有输出s的数据
126 
127         return j+Theshy("混子","上单").info()
128         #这就成功输出了
129         #原因是s=Theshy("混子","上单").info()
130         #他不是一个str,而是一个实例化变量
131 
132 IIII=wo_4("混子","上单","就离谱")
133 print(IIII.info())
134 
135 print("/////////////////////////////")
136 
137 #重写方法
138 #如果子类方法和父类方法名相同,且参数列表也相同,只是方法体不同
139 #那么子类就可以重写父类的方法
140 
141 class L_old_man(object):
142     def __init__(self,dd):
143         self.dd=dd
144 
145     def dede (self):
146         print(self.dd)
147 
148 L=L_old_man("得得得!")
149 L.dede()
150 #我们看到这里定义的dede方法
151 #dede方法现在输出的内容是self.dd的内容
152 #我们在以这个类为父类来定义一个新的类
153 
154 class gaiya(L_old_man):
155     def __init__(self,dd):
156         super().__init__(dd)
157 
158     def dede(self):
159         print("你能秒我?{0}".format(self.dd))
160 #我们现在以L_old_man定义成了gaiya的父类
161 #然后我们直接调用父类的__init__函数体
162 #然后我们在保证函数名和参量和父类完全一致的情况下
163 #对dede的函数体行了修改
164 LL=gaiya("得得得!")
165 LL.dede()
166 #这样我们就把父类的函数重构了
167 
168 #我们知道子类可以调用父类的方法
169 #那么如果我们这里子类和父类方法名字一样
170 #只是传入参数不一样会发生什么呢?
171 #简单的我们直接在上面的两个类中进行修改
172 
173 class L_old_man(object):
174     def __init__(self,dd):
175         self.dd=dd
176 
177     def dede (self):
178         #错误案例
179         #dd=dd*dd
180         self.dd=self.dd*self.dd
181         print("乘方值={0}".format(self.dd))
182 
183 class gaiya(L_old_man):
184     def __init__(self,dd,ddd):
185         super().__init__(dd)
186         self.ddd=ddd
187 
188     def dede(self):
189         super().dede()
190 
191     def dede(self,ddd):
192         j=self.dd
193         for i  in range(ddd-1):           
194             #错误案例
195             #dd=dd*j
196             self.dd=self.dd*j
197         print("乘法值={0}".format(self.dd))
198 
199 LLL=gaiya(2,5)
200 #LLL.dede()
201 #但是并不行
202 #他显示报错,表示缺失了ddd这个变量
203 #LLL.dede(5)
204 #然后当我们输入了ddd以后,他显示的是
205 #UnboundLocalError: local variable 'dd' referenced before assignment
206 #意思是dd不是全局变量
207 #那前面的那个是不是父类是否也出现了一样的问题呢?
208 
209 LLLL=L_old_man(2)
210 #LLLL.dede()
211 #出现了同样的问题
212 #这时候我们发现可能是丢失了self的前缀
213 #修改完后再次运行
214 LLLL.dede()
215 #成功运行
216 #看来子类也是同样的问题
217 LLL.dede(3)
218 # 这样问题就解决了
219 
220 print("////////////////////////////////")
221 
222 #多继承
223 #就是一个子类有多个父类
224 #而如果要调用某个方法
225 #系统会先从子类中查找,然后再对父类,按照从左到右的次序来查找
226 #如果还没有找到,就会去父类的父类中,按照这个顺序继续找
227 
228 class daye(object):
229     def speak(self):
230         print("你野爹我来了!")
231 
232 class zhongdan(object):
233     def speak(self):
234         print("待会下来给你抓")
235 
236 class shangdan(object):
237     def speak(self):
238         print("我TP好了")
239 
240 class fuzhu(object):
241     def speak(self):
242         print("回来点,我点燃好了")
243     
244 class ADC(daye,zhongdan,shangdan,fuzhu):
245     pass
246 
247 ADC_player=ADC()
248 ADC_player.speak()
249 #这里在ADC中没有找到speak
250 #于是在父类中索引的
251 #按照在ADC()中写的父类顺序
252 #从左到右来找的
253 
254 #我们再把这一串代码微调一下
255 class daye_2(object):
256     def high_speak(self):       #这里修改了打野的方法名字
257         print("你野爹我来了!")
258 
259 class zhongdan_2(daye):           #这里把打野调整成了中单的父类
260     def speak(self):
261         print("待会下来给你抓")
262 
263 class shangdan_2(zhongdan,daye):  #这里我们把打野和中单调整成了上单的父类
264     def speak(self):
265         print("我TP好了")
266 
267 class fuzhu_2(object):
268     def speak(self):
269         print("回来点,我点燃好了")
270     
271 class ADC_2(daye_2,zhongdan_2,shangdan_2,fuzhu_2):
272     pass
273 
274 ADC_player=ADC_2()
275 ADC_player.high_speak()
276 #这里我们调用high_speak()
277 #ADC_player.high_speak()
278 #Message=Cannot create a consistent method resolution
279 #order (MRO) for bases daye, zhongdan, shangdan, fuzh
280 #那么为什么会报错呢
281 #我们这里daye中只有一个方法
282 #而且打野中在这里是从左到右的第一个
283 #为什么会找不到呢?
284 #这里要注意的是!!!其实在索引的时候,并不是按照我们先前讲的那样
285 
286 #引用Python3.86手册的内容
287 #对于多数应用来说,在最简单的情况下,
288 #你可以认为搜索从父类所继承属性的操作是深度优先、从左至右的,
289 #当层次结构中存在重叠时不会在同一个类中搜索两次。
290 
291 #这说明,我们这里的调用方法,在深度优先从左至右的情况下
292 #多次跑到了同一个类中所以会出现各种问题
293 
294 class daye_3(object):
295     def speak_2(self):
296         print("你野爹我来了!")
297 
298 class zhongdan_3(object):
299     def speak(self):
300         print("待会下来给你抓")
301 
302 class shangdan_3(object):
303     def speak(self):
304         print("我TP好了")
305 
306 class fuzhu_3(object):
307     def speak(self):
308         print("回来点,我点燃好了")
309     
310 class ADC_3(daye_3,zhongdan_3,shangdan_3,fuzhu_3):
311     pass
312 
313 ADC_player=ADC_3()
314 ADC_player.speak_2()
315 
316 #好了
317 #问题奇奇怪怪的解决了
318 #我修改了所有类的名字
319 #让他们都变成建立一个新类
320 #然后就好了
321 #具体,,,我不知道为什么了

 

承,我也有些不明白,希望大佬如果知道为什么回复一下我,谢谢您了!

posted @ 2020-10-19 15:33  想活出点人样  阅读(122)  评论(0编辑  收藏  举报