黑马程序员技术交流社区
标题: 面向对象(上) [打印本页]
作者: 小江哥 时间: 2018-12-8 17:19
标题: 面向对象(上)
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)
作者: 一个人一座城0.0 时间: 2018-12-8 20:56
看看不说话
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |