day 22 面向对象的基础
面向对象:
1、简述编写和执行类中的方法的流程
class Foo: #类的编写 def func(): print("我爱你") obj = Foo() #类的调用和执行 obj.func()
2、面向对象的三大特征?
封装、继承、多态
封装:
归类:将相关的功能封装到一个类中、
打包:将数据封装到一个对象中
继承:
自己没有找老爸要
当有两个类或者多个类,其中都有共同的方法时,为了避免代码重复编写,把它放到父亲中
多态:
python原生支持多态,崇尚鸭子模型,由于python函数传参时无法指定类型
def func (arg): #arg可以时多种类型,只要其中有send方法即可。
arg.send()
3、什么是构造方法?
__init__
4、面向对象中为什么要有继承?
提高代码的复用性,调用原则:先找self所在的函数中,没有的话找父亲要,父亲没有再去找爷爷
5、python多继承的原则?
先从左到右
6、面向对象方式的格式?
定义: class 类名: - 定义了一个类 def 函数名(self): - 在类中编写了一个"方法" pass 调用: x1 = 类名() - 创建了一个对象/实例化一个对象 x1.函数名() - 通过对象调用其中一个方法.
7、构造方法
class Foo: def __init__(self,name): #构造方法,目的进行数据初始化. self.name = name self.age = 18 obj = Foo('侯明魏') #通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可.
应用:1,将数据封装到对象中,以供自己再方法中调用
2,将数据封装到对象中,以供其它函数调用
8、面向对象代码如何编写?
方式一、归类+提取公共值
方式二、正向编写。在指定类中编写和当前类相关的所有代码 + 提取公共值
9、self到底是谁?
self参数时python帮助我们自动传参
如果执行面向对象中的方法时,前面必须有一个对象:xxx.func()
1 s15day22 面向对象 2 3 接下来内容: 4 第一部分:面向对象 5 第二部分:网络编程 6 第三部分:并发编程 7 8 内容回顾: 9 1. 面向过程 10 11 2. 函数式编程 12 13 def func(arg): 14 pass 15 16 func(1) 17 func(2) 18 19 3. 为什么要将某些函数写在指定文件中? 20 对函数进行归类 21 22 今日内容: 23 1. 函数式编程和面向对象的对比 24 25 2. 面向对象代码如何编写 26 27 3. 面向对象三大特性:封装/继承/多态 28 29 内容详细: 30 1. 函数式编程和面向对象的对比 31 32 a. round 1 请开发一个消息提醒的功能(邮件/短信/微信) 33 34 函数: 35 def email(em,text): 36 """ 37 发送邮件 38 :return: 39 """ 40 print(em,text) 41 42 def msg(tel,text): 43 """ 44 发送短信 45 :return: 46 """ 47 print(tel,text) 48 49 def wechat(num,text): 50 """ 51 发送微信 52 :return: 53 """ 54 print(num,text) 55 56 57 # 编写功能:假设用户购买课程,然后给alex发送提醒; 58 if 1==1: 59 msg('188888888','张进购买了一个学位课') 60 email('alex@sb.com','张进购买了一个学位课') 61 wechat('xxxx','张进购买了一个学位课') 62 63 面向对象: 64 class Message: 65 def email(self, em, text): 66 """ 67 发送邮件 68 :return: 69 """ 70 print(em,text) 71 72 def msg(self, tel, text): 73 """ 74 发送短信 75 :return: 76 """ 77 print(tel,text) 78 79 def wechat(self, num, text): 80 """ 81 发送微信 82 :return: 83 """ 84 print(num,text) 85 86 87 # 编写功能:假设用户购买课程,然后给alex发送提醒; 88 if 1==1: 89 obj = Message() 90 obj.email('alex@sb.com', '张进购买了一个学位课') 91 obj.msg('188888888','张进购买了一个学位课') 92 obj.wechat('xxxx','张进购买了一个学位课') 93 94 95 对比: 96 函数:定义简单/调用简单 97 面向对象:定义复杂/调用复杂 好处:归类,将某些类似的函数写在一起 98 99 总结: 100 1. 函数式编程可能会比面向对象好. 101 2. Python中支持两种编程方式. 102 3. 面向对象方式格式: 103 定义: 104 class 类名: - 定义了一个类 105 106 def 函数名(self): - 在类中编写了一个"方法" 107 pass 108 调用: 109 x1 = 类名() - 创建了一个对象/实例化一个对象 110 x1.函数名() - 通过对象调用其中一个方法. 111 112 4. 示例: 113 class Account: 114 def login(self): 115 user = input('请输入用户名:') 116 pwd = input('请输入密码:') 117 if user == 'alex' and pwd == 'sb': 118 print('登录成功') 119 else: 120 print('登录失败') 121 122 obj = Account() 123 obj.login() 124 125 126 b. round 2 打印 127 """ 128 完成以下功能: 129 老狗/20岁/男/上山去砍柴 130 老狗/20岁/男/开车去东北 131 老狗/20岁/男/喜欢大宝剑 132 """ 133 134 # ##################### 函数版本 ######################### 135 """ 136 def kc(name,age,gender): 137 data = "%s,性别%s,今年%s岁,喜欢上山砍柴" %(name,gender,age) 138 print(data) 139 140 def db(name,age,gender): 141 data = "%s,性别%s,今年%s岁,喜欢开车去东北" %(name,gender,age) 142 print(data) 143 144 def bj(name,age,gender): 145 data = "%s,性别%s,今年%s岁,喜欢大宝剑" %(name,gender,age) 146 print(data) 147 148 149 kc('老狗',20,'男') 150 kc('老狗',20,'男') 151 db('老狗',20,'男') 152 bj('老狗',20,'男') 153 """ 154 # ##################### 面向对象 ######################### 155 class LaoGou: 156 157 def __init__(self,name,age,gender): # 特殊的方法,如果 类名() ,则该方法会被自动执行 (构造方法) 158 self.n1 = name 159 self.n2 = age 160 self.n3 = gender 161 162 def kc(self): 163 data = "%s,性别%s,今年%s岁,喜欢上山砍柴" %(self.n1,self.n3,self.n2) 164 print(data) 165 166 def db(self): 167 data = "%s,性别%s,今年%s岁,喜欢开车去东北" %(self.n1,self.n3,self.n2) 168 print(data) 169 170 def bj(self): 171 data = "%s,性别%s,今年%s岁,喜欢大宝剑" %(self.n1,self.n3,self.n2) 172 print(data) 173 174 obj = LaoGou('老狗',20,'男') 175 obj.kc() 176 obj.db() 177 obj.bj() 178 179 180 总结: 181 1. 构造方法 182 示例一: 183 class Foo: 184 185 def __init__(self,name): 构造方法,目的进行数据初始化. 186 self.name = name 187 self.age = 18 188 189 obj = Foo('侯明魏') 190 191 通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可. 192 193 示例二: 194 class Bar: 195 pass 196 obj = Bar() 197 198 2. 应用 199 a. 将数据封装到对象中,以供自己在方法中调用 200 class FileHandler: 201 def __init__(self,file_path): 202 self.file_path = file_path 203 self.f = open(self.file_path, 'rb') 204 205 def read_first(self): 206 # self.f.read() 207 # ... 208 pass 209 210 def read_last(self): 211 # self.f.read() 212 # ... 213 pass 214 215 def read_second(self): 216 # self.f... 217 # ... 218 pass 219 220 obj = FileHandler('C:/xx/xx.log') 221 obj.read_first() 222 obj.read_last() 223 obj.read_second() 224 obj.f.close() 225 226 b. 将数据封装到对象中,以供其他函数调用 227 def new_func(arg): 228 arg.k1 229 arg.k2 230 arg.k6 231 232 class Foo: 233 def __init__(self,k1,k2,k6): 234 self.k1 = k1 235 self.k2 = k2 236 self.k6 = k6 237 238 obj = Foo(111,22,333) 239 new_func(obj) 240 241 242 练习: 信息管理系统 243 1. 用户登录 244 2. 显示当前用户信息 245 3. 查看当前用户所有的账单 246 4. 购买姑娘形状的抱枕 247 248 示例: 249 class UserInfo: 250 251 def __init__(self): 252 self.name = None 253 254 def info(self): 255 print('当前用户名称:%s' %(self.name,)) 256 257 def account(self): 258 print('当前用户%s的账单是:....' %(self.name,)) 259 260 def shopping(self): 261 print('%s购买了一个人形抱枕' %(self.name,)) 262 263 def login(self): 264 user = input('请输入用户名:') 265 pwd = input('请输入密码:') 266 if pwd == 'sb': 267 self.name = user 268 while True: 269 print(""" 270 1. 查看用户信息 271 2. 查看用户账单 272 3. 购买抱枕 273 """) 274 num = int(input('请输入选择的序号:')) 275 if num == 1: 276 self.info() 277 elif num ==2: 278 self.account() 279 elif num == 3: 280 self.shopping() 281 else: 282 print('序号不存在,请重新输入') 283 else: 284 print('登录失败') 285 286 obj = UserInfo() 287 obj.login() 288 289 总结: 290 class Foo: 291 def func2(self): 292 print('func2') 293 294 def func1(self): 295 self.fun2() 296 print('func1') 297 298 299 obj = Foo() 300 obj.func1() 301 302 303 2. 面向对象代码如何编写 304 a. 规则 305 306 class Foo: 307 308 def __init__(self,name): 309 self.name = name 310 311 312 def detail(self,msg): 313 print(self.name,msg) 314 315 obj = Foo() 316 obj.detail() 317 318 319 b. 什么时候写?如何写? 320 321 方式一:归类+提取公共值 322 归类: 323 class File: 324 def file_read(self,file_path): 325 pass 326 327 def file_update(self,file_path): 328 pass 329 330 def file_delete(self,file_path): 331 pass 332 333 def file_add(self,file_path): 334 pass 335 336 class Excel: 337 def excel_read(self,file_path): 338 pass 339 340 def excel_update(self,file_path): 341 pass 342 343 def excel_delete(self,file_path): 344 pass 345 346 def excel_add(self,file_path): 347 pass 348 349 提取公共值: 350 class File: 351 def __init__(self,file_path): 352 self.file_path = file_path 353 354 def file_read(self): 355 pass 356 357 def file_update(self): 358 pass 359 360 def file_delete(self): 361 pass 362 363 def file_add(self): 364 pass 365 366 class Excel: 367 def __init__(self,file_path): 368 self.file_path = file_path 369 370 def excel_read(self): 371 pass 372 373 def excel_update(self): 374 pass 375 376 def excel_delete(self): 377 pass 378 379 def excel_add(self): 380 pass 381 382 方式二:在指定类中编写和当前类相关的所有代码 + 提取公共值 383 384 class Message: 385 def email(self): 386 pass 387 388 class Person: 389 def __init__(self,na, gen, age, fig) 390 self.name = na 391 self.gender = gen 392 self.age = age 393 self.fight =fig 394 395 def grassland(self): 396 self.fight = self.fight - 10 397 398 def practice(self): 399 self.fight = self.fight + 90 400 401 def incest(self): 402 self.fight = self.fight - 666 403 404 405 cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色 406 dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色 407 bo = Person('波多多', '女', 19, 2500) # 创建波多多角色 408 409 dong.grassland() 410 411 412 3. 面向对象的三大特性:封装/继承/多态 413 414 封装: 415 将相关功能封装到一个类中: 416 class Message: 417 def email(self):pass 418 def msg(self):pass 419 def wechat(self):pass 420 将数据封装到一个对象中: 421 422 class Person: 423 def __init__(self,name,age,gender): 424 self.name = name 425 self.age = age 426 self.gender = gender 427 428 obj = Person('孙福来',18,'女') 429 继承: 430 class SuperBase: 431 def f3(self): 432 print('f3') 433 434 class Base(SuperBase): # 父类,基类 435 def f2(self): 436 print('f2') 437 438 class Foo(Base): # 子类,派生类 439 440 def f1(self): 441 print('f1') 442 443 obj = Foo() 444 obj.f1() 445 obj.f2() 446 obj.f3() 447 # 原则:现在自己类中找,么有就去父类 448 449 总结: 450 1. 继承编写 451 452 class Foo(父类): 453 pass 454 455 2. 支持多继承(先找左/再找右) 456 457 458 3. 为什么要有多继承? 提供代码重用性 459 460 461 练习: 找self到底是谁的对象?从谁开始找. 462 463 多态: 464 多种形态或多种状态 465 鸭子模型,只要可以嘎嘎叫就是鸭子. 466 467 Python 468 # 由于python原生支持多态,所以没有特殊性. 469 """ 470 class Foo1: 471 def f1(self): 472 pass 473 474 class Foo2: 475 def f1(self): 476 pass 477 478 class Foo3: 479 def f1(self): 480 pass 481 482 483 def func(arg): 484 arg.f1() 485 486 obj = Foo1() # obj= Foo2() obj = Foo3() 487 func(obj) 488 """ 489 490 java 491 class Son(list): 492 pass 493 494 class Son1(list): 495 pass 496 497 # 以后传参时,arg可以是:list类的对象/list任何子类的对象 498 public void func(list arg){ 499 print(arg) 500 } 501 502 # obj = list() 503 # obj = Son() 504 obj = Son1() 505 func(obj) 506 507 重点: 508 1. 编写方式执行流程 509 510 2. 如何归类? 511 反向:归类+提取公共值 512 正向:类相关的功能+提取公共值 513 514 3. 三大特性 515 516 作业:练习题 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545