1. 什么是
⾯
向对象 ?思考: 设计 五
⼦
棋游戏 的 编程思路
1. 对于
⼤
型程序,其逻辑和功能都很复杂,如果按照业务逻辑 去想,我们往往⽆
从下⼿
。2. 换
⼀
个⽅
式,想⼀
想五⼦
棋游戏中有哪些元素? 这些元素 都做了什么?2.
⾯
向对象概念1. 棋
⼿
、棋盘都可以作为⼀
个整体,来记录⼀
些与之相关联的数据,完成⼀
些与之相关联的操作,我们可以将这个整体称为 对象2.
⾯
向对象编程 (OOP,Object Oriented Programming)可以理解为将具有相互关系的数据/操作封装成对象,以对象的⻆
度去处理问题,让对象来完成相应处理3.
⾯
向对象和 ⾯
向过程按照业务逻辑 编写五
⼦
棋程序,过程应该是这样的:1. 先显示棋盘()
2. 执⿊棋⼿下⼦()
3. 接着刷新界⾯()
4. 然后判断⿊⼦是否胜出()
5. 执⽩棋⼿下⼦()
6. 接着刷新界⾯()
7. 然后判断⽩⼦是否胜出()
按照业务逻辑 从上到下 设计程序 的
⽅
式,叫做 ⾯
向过程编程 (ProcedureOrientedProgramming,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)
更多项目资料可关注:gzitcast