面向对象(上)

118 阅读8分钟
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)

更多项目资料可关注:gzitcast