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
浙公网安备 33010602011771号