1. 什么是 ⾯向对象 ? 思考: 设计 五⼦棋游戏 的 编程思路
1. 对于⼤型程序,其逻辑和功能都很复杂,如果按照业务逻辑 去想,我们往往⽆从下⼿。 2. 换⼀个⽅式,想⼀想五⼦棋游戏中有哪些元素? 这些元素 都做了什么? 2. ⾯向对象概念 1. 棋⼿、棋盘都可以作为⼀个整体,来记录⼀些与之相关联的数据,完成⼀些与之相关联的操作,我们可以将这个整体称为 对象 2. ⾯向对象编程 (OOP,Object Oriented Programming)可以理解为将具有相互关系的数据/操作封装成对象,以对象的⻆度去处理问题,让对象来完成相应处理 3. ⾯向对象和 ⾯向过程 按照业务逻辑 编写五⼦棋程序,过程应该是这样的: 1. 先显示棋盘() 2. 执⿊棋⼿下⼦() 3. 接着刷新界⾯() 4. 然后判断⿊⼦是否胜出() 5. 执⽩棋⼿下⼦() 6. 接着刷新界⾯() 7. 然后判断⽩⼦是否胜出() 按照业务逻辑 从上到下 设计程序 的⽅式,叫做 ⾯向过程编程 (ProcedureOriented Programming,POP,⾯向过程程序设计) ⾯向过程编程 最易被初学者接受,其往往⽤⼀⻓段代码来实现指定功能,⼀步接⼀步,环环相扣对于⼤型项⽬,如果使⽤⾯向过程编程,则很容易导致代码结构过于紧密、耦合度⾼,易出现代码冗余,并且 不利于团队开发 以对象的视⻆ 编写五⼦棋程序,过程是这样的: ⾯向对象编程 的优点 将数据和业务抽象为 对象,有利于程序整体结构的分析和设计,使设计思路更加清晰 业务以对象为单位,对象各⾃完成⼯作,减少了代码耦合度,有助于业务升级 和 代码重构 ⽅便⼯作划分,有利于提⾼团队开发的效率 类和对象 ⽬标 对象 对象的组成类 类和对象的关系 1. 对象 对象 是承载数据,执⾏操作的 ⼀个具体 ”事物”,⽐如具体某⼀个⼈,具体某⼀只狗... 思考: 五⼦棋游戏中,有⼏个对象? 2. 对象的组成 对象中包含两个组成部分: 属性: ⽤于记录与对象相关的数据,⽐如姓名,年龄,身⾼,肤⾊等 ⽅法: ⽤于实现与对象相关的操作,⽐如吃饭,睡觉,⻜⾏,歌唱等 ⾯向对象演练 下图中,有哪些对象/属性/⽅法?
* 对象: 向⽇葵1 * 属性: ⾎量(100) *⽅法:放阳光 * 对象: 向⽇葵2 * 属性: ⾎量(100) *⽅法:放阳光 ... * 对象:豌⾖1 *属性:颜⾊(绿)、发型(1)、⾎量(100) *⽅法:发炮, 摇头 * 对象:豌⾖2 *属性:颜⾊(蓝)、发型(2)、⾎量(100) *⽅法:发炮, 摇头 ... * 对象:坚果1 * 属性: ⾎量(100) *⽅法:阻挡 * 对象:坚果2 * 属性: ⾎量(50) *⽅法:阻挡 ... * 对象:僵⼫1 3. 类 物以类聚,⼈以群分 很多事物存在 相同的操作/⾏为,⽐如⼈都进⾏吃饭、睡觉,狗都会跑会叫等等描述共同⾏为的集合,称为类 (class) 类是总结事物特征的 抽象概念,⽽对象是 具体存在的某个实物 以下哪些是类,哪些是对象? 奔驰汽⻋奔驰smart 张三的那辆奔驰smart狗 ⼤⻩狗 李四家那只⼤⻩狗 ⽔ 果 苹 果 红苹果 红富⼠苹果 类是总结事物特征的 抽象概念,⽽对象是 具体存在的某个实物 4. 类和对象的关系 在编程中,类就是创建对象的模板 或者说 制造⼿册,⽤来定义对象公共的⾏为类总结了对象的共同特征,有利于复⽤代码创建拥有相同特征的对象 每个对象必须有⼀个对应的类
定义类 ⽬标 定 义 类 定义⽅法 1. 定义类 定义⼀个类,格式如下: 类名 的命名规则按照"⼤驼峰" 2. 定义⽅法 类是定义对象的共同⾏为的,也就是说 在类中定义对象的⽅法 定义⽅法: ⽅法的格式和函数类似,也可以设置参数和返回值,但是 需要设置第⼀个参数为 self 注意定义⽅法需要在类的缩进中 demo:定义⼀个Car类 创建对象 ⽬标 创建对象调⽤⽅法 定义/使⽤属性创建多个对象 1. 创建对象 python中,可以根据已经定义的类去创建出对象创建对象的格式为: 创建对象demo: 2. 调⽤⽅法 创建对象的格式为: 注意:虽然定义⽅法时设置第⼀个参数 self ,但是调⽤⽅法时不要传递对应 self 的参数 对象调⽤⽅法demo: 提示:pycharm测试之前学习过的各种数据类型变量,可以发现都会提示若⼲⽅法,这说明了什么? 3. 定义/使⽤属性 定义/设置属性 格式: 属性和变量类似,⾸次赋值时会定义属性: 4. 创建多个对象 类作为对象的模具,根据类可以创建多个对象 提问:如果对象有⼀个 独⼀⽆⼆的⾏为,不是共同的,这个⽅法定义在哪⾥? python语法要求 ⽅法必须定义在类中,如果某个⾏为只有⼀个对象拥有,也需要为该对象单独设计⼀个类。 self ⽬标 self 关键字的使⽤ ⽅法中定义属性 1. self 提问:如果对象的⽅法中需要使⽤该对象的属性,怎么办? 关键字self 主要⽤于对象⽅法中,表示调⽤该⽅法的对象 在⽅法中使⽤ self ,可以获取到调⽤当前⽅法的对象,进⽽获取到该对象的属性和⽅法提问:调⽤对象的⽅法时,为什么不需要设置self对应的实参? 某个对象调⽤其⽅法时,python解释器会把这个对象作为第⼀个参数传递给⽅法,所以开发者只需要在定义⽅法时 “预留” 第⼀个参数为 self 即可 . ⽅法中定义属性 使⽤ self 操作属性 和对象的变量名操作属性效果上相同,如果属性在赋值时还没有定义,则会 ⾃动定义属性并赋值 init ()⽅法 ⽬标 init () 基本使⽤ init () ⾃定义参数 1. init ()基本使⽤ 如何让创建出来的对象包含⼀些默认属性,并且有初始值? init () ⽅法叫做 对象的初始化⽅法,在创建⼀个对象后默认会被调⽤,不需要⼿动调⽤开发者可以实现这个⽅法,并在该⽅法中定义属性并设置初始值 2. init ()⾃定义参数 如果对象默认属性的初始值不⼀样,怎么办? init (self) 除了默认参数self ,还可以设置任意个数的⾃定义参数,例如 init (self,x,y,z) init⽅法 设置的⾃定义参数必须和创建对象时传递的参数保持⼀致,例如 tom = Cat(x,y,z) 开发者可以 设置⾃定义参数,为对象的默认属性提供 不同的初始值 开发中,⼀般会在 init () 中定义对象的属性 self.name = new_name self.age = new_age def introduce(self): print("名字是:%s,年龄是:%d" % (self.name, self.age)) # 创建了⼀个对象 tom = Cat("汤姆",30) # 添加属性 # tom.name = "汤姆" # tom.age = 30 # 获取属性print(tom.name)print(tom.age) tom.introduce() # 相当于tom.introduce(tom) print("="*30) lan_mao = Cat("蓝猫", 20) # lan_mao.name = " 蓝 猫" # lan_mao.age = 20 lan_mao.introduce() str ()⽅法 如果直接print打印对象,会看到创建出来的对象在内存中的地址 当使⽤ print(xx) 输出对象的时候,只要对象定义了 str (self) ⽅法,就会打印该⽅法 return的信息描述 在python中⽅法名如果是 xxxx () 的,那么就有特殊的功能,因此叫做“魔法”⽅法 class Cat: """定义⼀个猫类""" definit (self,new_name, new_age): """在创建完对象之后 会⾃动调⽤, 它完成对象的初始化的功能"""# self.name = "汤姆" #self.age = 20 self.name = new_name self.age = new_age# 它是⼀个对象中的属性,在对象中存储,即只要这个对象还存在,那么这个变量就 # num = 100 # 它是⼀个局部变量,当这个函数执⾏完之后,这个变量的空间就没有了,因此其他⽅法不 defstr (self): """返回⼀个对象的描述信息"""# print(num) return "名字是:%s , 年龄是:%d" % (self.name, self.age) def eat(self): print("%s在吃⻥...." % self.name) def drink(self): print("%s在喝可乐..." % self.name) def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age)) print("名字是:%s, 年龄是:%d" % (self.name, self.age)) # 创建了⼀个对象 tom = Cat("汤姆", 30)print(tom)
|