第十六天 面向对象 |
B站链接:https://www.bilibili.com/video/BV1gf4y1S7Y9
一、面向对象基础
1、目标:
1、理解面向对象
2、类和对象
3、添加和获取对象属性
4、魔法方法
2、好处:化简代码,代码、逻辑更简单
3、面向对象是一种,抽象化的编程思想,通过编程设置事物能够做什么事,事物直接使用,不用管内部的情况
4、面向对象就是将编程当成一个事物,编程是设置事物能够做什么事
二、类和对象
面向对象编程过程中,有两个重要组成部分:类和对象
举例:类,创建图纸;对象,洗衣机。最后,我们使用洗衣机洗衣服
二者关系:用类去创建对象,也可以表述为用类去实例化对象。
类概念:
类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的事物
特征:即属性;行为:即方法
对象概念:
对象是类创建出来的真实存在的事物
注意:
在开发中,先有类,再有对象
三、面向对象实现方法
定义方法
类名,命名大驼峰
class 类名()
代码
…
定义类
用类去创建对象,对象名(又叫实例)
对象名 = 类名()
代码
在类里将函数功能封装起来def,使用函数,需要创建对象,即实例化方法:对象名.类名()
# 洗衣机-洗衣
# 1、定义洗衣机类
class Washer():
# 在类里将洗衣服的功能封装起来,功能--定义一个函数def
def wash(self):
print('可以洗衣服')
# 2、创建对象 对象名=类名()
haier = Washer()
# 3、验证成果
# 打印haier
print(haier) # <__main__.Washer object at 0x000002323211A198>
# 使用wash功能--实例方法/对象方法--对象名.wash()
haier.wash() # 可以洗衣服
类里面的self
self指的是调用该函数的对象,因为打印二者得到的内存地址一样
一个类可以创建多个对象
1、1个类可以创建多个对象
2、多个对象的self地址不相同
class Washer():
def wash(self):
print('可以洗衣服')
print(self)
wash1 = Washer()
wash1.wash() # <__main__.Washer object at 0x0000024B5AE7A198>
wash2 = Washer()
wash2.wash() # <__main__.Washer object at 0x000001B70253A860>
三、添加或获取对象属性
类外面
'''
属性即特征
学习添加和获取属性
对象属性可以在类内/外(添加)和(获取)属性
'''
# 1、类外面添加对象属性
# 语法:对象名.属性名 = 值
class Washer():
def wash(self):
print('可以洗衣服')
# 创建对象,对象名=类名()
haier1 = Washer()
# 添加对象属性,对象名.属性名 = 值
haier1.width = 400
haier1.height = 500
# 2、在类外面获取对象属性,对象名.属性名
print(f'haier1洗衣机的宽度是{haier1.width}')
print(f'haier1洗衣机的高度是{haier1.height}')
# haier1洗衣机的宽度是400
# haier1洗衣机的高度是500
类里面
# 3、类里面获取对象属性
# 语法:self.属性名
class Washer():
def wash(self):
print('可以洗衣服')
def print_info(self):
# 4、在类里面获取实例属性
print(f'haier1洗衣机的宽度是{self.width}')
print(f'haier1洗衣机的高度是{self.height}')
# 创建对象,对象名=类名()
haier1 = Washer()
# 添加实例属性,对象名.属性名 = 值
haier1.width = 400
haier1.height = 700
# 对象调用实例方法
haier1.print_info()
四、魔法方法
1、魔法方法简介
__XX__()
的函数叫做魔法方法,指的是具有特殊功能的函数
2、魔法方法分类
2.1__init__()
1、创建对象之前就有与生俱来的属性
__init__()
:初始化对象,添加实例属性
在创建一个对象的时候,默认被调用,不需要手动调用
self属性,解释器会自动把当前的对象引用传递过去
流程:
1、定义类
--init魔法方法:width和height实例属性
--添加实例方法:访问实例属性
2、创建对象
3、验证成果
--调用实例方法
class Washer():
def __init__(self):
# 添加实例属性
self.width = 50
self.height = 800
# 添加实例方法
def print_info(self):
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')
# 创建对象
haier = Washer()
haier.print_info()
# 洗衣机的宽度是50
# 洗衣机的高度是800
2.2__init__(self)带参数
一个类可以创建多个对象,对不同的对象,设置不同的初始化属性
class Washer():
def __init__(self,width,height): # 带有两个形参
self.width = width # 实例属性
self.height = height
def washer(self):
print(f'洗衣机的宽是{self.width}') # 实例方法中调用实例属性
print(f'洗衣机的高是{self.height}')
haier = Washer(10,20) # 创建对象,输入真实数据
haier.washer() # 调用实例方法
# 洗衣机的宽是10
# 洗衣机的高是20
2.3__str__
定义str,将会返回这个方法中return的数据(解释说明的文字),而不是返回该对象的默认地址
因为:当使用print输出对象的时候,默认打印对象的内存地址
class Washer():
def __init__(self):
self.width = 300
def __str__(self):
return '解释说明:类的说明或对象状态的说明'
haier = Washer()
print(haier) # 解释说明:类的说明或对象状态的说明
2.4__del__
魔法方法__del__()
删除对象时,python解释器会默认调用__del__()方法
class Washer():
def __init__(self):
self.width = 300
def __str__(self):
return '123'
def __del__(self):
print('对象已经删除')
haier = Washer()
print(haier)
# 按顺序执行Waser里面的实例方法
# 123
# 对象已经删除
五、面向对象综合应用(案例)
烤地瓜
1、需求
被烤的时间和对应的地瓜状态
添加调料
2、分析步骤(明确需求的前提下)
将涉及的事物进行分类——事物,地瓜;类,地瓜类
2-1定义类
地瓜的属性:(初始化属性)
被烤的时间
地瓜的状态
添加的调料
地瓜的方法:
被烤
添加调料
显示对象信息__str__,用于输出对象状态,(这里是指时长多少,烤熟没)
2-2创建对象,并调用对应的实例方法
3、代码落地
案例一:烤地瓜
搬家具
1、需求:将小于房子剩余面积的家具摆放到房子中
2、分析步骤
将涉及的事物进行分类——事物:房子和家具
——类:房子类和家具类
再用类实例化对象
2-1定义类
2-1-1房子类
(1)实例属性:
1)房子地理位置
2)房子占地位置
3)房子剩余位置
4)房子内家具列表)
(2)实例方法:是否能容纳家具
(3)显示房屋信息
2-1-2家具类
(1)实例属性
1)家具名称
2)家具占地位置
2-2创建对象,并调用对应的实例方法
3、代码落地
1、定义类
初始化属性、被烤和添加调料(list存储)的方法,显示对象信息的str
1-1初始化属性
class SweetPotato():
def __init__(self):
self.cook_time = 0
self.cook_state = '生的'
self.condiments = [] # 用空列表存储
1-2烤地瓜的方法+显示对象信息
1、定义类的cook方法:计算烤过的时间,并通过if条件判断句和烤的状态相联系
2、使用魔法方法__str__()的return显示地瓜烤的时间以及烤的状态
3、使用self.cook_time += time ,可以计算总的烤的时间,若不熟,还可以接着烤。
# 烤地瓜的方法
def cook(self,time):
# 1、计算整体地瓜烤过的时间
self.cook_time += time
# 2、用整体烤过的时间再判断地瓜的状态
if 0 <= self.cook_time < 3:
self.cook_state = '生的'
elif 3 <= self.cook_time < 5:
self.cook_state = '半生不熟'
elif 5 <= self.cook_time < 8:
self.cook_state = '熟了'
elif self.cook_time >= 8:
self.cook_state = '烤糊了'
def __str__(self):
return f'这个地瓜的被烤过时间是{self.cook_time}分钟,状态是{self.cook_state}'
1-3加调料的方法+显示对象信息
放置在列表里,初始化时带有condiment,此形参可以接收顾客添加自己想要的真实数据(实参)
def add_condiments(self,condiment):
# 用户意愿的调料追加到调料列表
self.condiments.append(condiment)
def __str__(self):
return f'这个地瓜的被烤过时间是{self.cook_time}分钟,状态是{self.cook_state},调料有{self.condiments}'
2、创建对象并调用相应的实例方法
# 2、创建对象并调用相应的实例方法
# 初始状态
digua1 = SweetPotato()
print(digua1) # 这个地瓜的被烤过时间是0分钟,状态是生的
# 传入真实参数--烤过的时间
digua1.cook(3)
digua1.add_condiments('辣椒面')
print(digua1) # 这个地瓜的被烤过时间是3分钟,状态是半生不熟
digua1.cook(4)
digua1.add_condiments('酱油')
print(digua1)
3、运行结果
这个地瓜的被烤过时间是0分钟,状态是生的,调料有[]
这个地瓜的被烤过时间是3分钟,状态是半生不熟,调料有['辣椒面']
这个地瓜的被烤过时间是7分钟,状态是熟了,调料有['辣椒面', '酱油']
案例二:搬家具
1、定义类
1-1家具类
# 家具类
class Furniture():
def __init__(self,name,area):
# 家具名字
self.name = name
# 家具占地面积
self.area = area
# def __str__(self):
# return f'家具是{self.name},占地是{self.area}平方米'
1-2房子类
# 房子类
# 1、实例属性
class Home():
def __init__(self,address,area):
# 地理位置
self.address = address
# 房屋面积
self.area = area
# 剩余面积
self.free_area =area
# 家具列表
self.furniture = []
def __str__(self):
return f'房子的地理位置在{self.address},房屋面积是{self.area},剩余面积是{self.free_area},家具有{self.furniture}'
1-3实例方法(容纳家具)
# 2、实例方法
# 房屋内添加家具,创建item形参去接收家具
def add_furniturn(self,item):
# self.item += item
if self.free_area >= item.area:
# 家具列表添加家具名字!!
self.furniture.append(item.name)
# 家具搬入后,剩余面积
self.free_area -= item.area
else:
print('家具太大,剩余面积不足,无法容纳')
2、创建对象并调用相应的实例方法
# 3、显示房屋信息
# 双人床,六平米
bed = Furniture('双人床',6)
# print(bed)
# 房子1:北京,1000
home1 = Home('北京',1000)
# 调用实例化方法
home1.add_furniturn(bed)
# 打印,显示
print(home1) # 房子的地理位置在北京,房屋面积是1000,剩余面积是994,家具有['双人床']
3、运行结果
房子的地理位置在北京,房屋面积是1000,剩余面积是994,家具有['双人床']
六、面向对象重要组成部分总结
用类去创建对象,也可以表述为用类去实例化对象
1、类
- 创建类
class 类名():
代码
2、对象
对象名.类名()
添加对象属性
- 类外面
对象名.属性名 = 值
- 类里面
self.属性名 = 值
获取对象属性
- 类外面
对象名.属性名
- 类里面
self.属性名
3、魔法方法
__init__()
初始化
__str__()
输出对象信息
__del__()
删除对象时调用