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 #具体,,,我不知道为什么了
承,我也有些不明白,希望大佬如果知道为什么回复一下我,谢谢您了!
悟已往之不谏,知来者之可追