day14 课程(面向对象 & 类和对象 & 魔法方法init|str|del & 烤地瓜案例 & 家具案例)
课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=266
14.1 了解面向对象
14.1.1 目标
理解面向对象
类和对象
添加和获取对象属性
魔法方法
14.1.2 理解面向对象
面向对象是一种抽象化的编程思想,很多编程语言中都有的一种思想
例如:洗衣服
思考:几种途径可以完成洗衣服?
答:手洗和机洗
手洗:找盆 - 放水 - 加洗衣粉 - 浸泡 - 搓洗 - 拧干水 - 倒水 - 漂洗N次 - 拧干 - 晾晒
机洗:打开洗衣机 - 放衣服 - 加洗衣粉 - 按下开始按钮 - 晾晒
思考:对比两种洗衣服途径,发现了什么?
答:机洗更简单
思考:机洗,只需要找到一台洗衣机,加入简单操作就可以完成洗衣服的工作,而不需要关心洗衣机内部发生了什么事情
总结:面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况,而编程就是设置事物能够做什么事
面向对象:创造洗衣机,用洗衣机做事情的过程
14.2 了解类和对象的关系
思考:洗衣机洗衣服描述过程中,洗衣机其实就是一个事物,即对象,洗衣机对象哪来的呢?
答:洗衣机是由工厂工人制造出来
思考:工厂工人怎么制造出的洗衣机?
答:工人根据设计师设计的功能图纸制作洗衣机
总结:图纸 -> 洗衣机 -> 洗衣服
在面向对象编程过程中,有两个重要组成部分:类 和 对象
类和对象的关系:用类去创建一个对象(也可以说 用类去实例化一个对象)
14.3 类和对象的语法
14.3.1 类
类是对一系列具有 相同特征 和 行为 的事物的统称,是一个抽象的概念,不是真实存在的事物
特征即是属性(即变量)
行为即是方法(即函数)
类比如是制造洗衣机时要用到的图纸,也就是说 类是用来创建对象

14.3.2 对象
对象是类创建出来的真实存在的事物,例如:洗衣机
注意:开发中,先有类,再有对象
14.3.3 体验定义类
Python2 中类分为:经典类 和 新式类
# 语法 class 类名(): 代码 ......
注意:类名要满足标识符命名规则,同时遵循 大驼峰命名习惯
14.3.4 体验创建对象
对象又叫实例
# 语法 对象名 = 类名()
14.4 体验类和对象
# 需求: 洗衣机 功能:能洗衣服 # 1.定义洗衣机类 class Washer(): def Wash(self): # 类中函数 自动提示出 self print("能洗衣服") # 2.创建对象 haier = Washer() # 3.验证类和对象是否创建成功 # 3.1 打印 haier 对象 print(haier) # 对象所在的内存地址 # 3.2 使用 Wash 功能 -- 实例方法/对象方法 haier.Wash() # 使用洗衣服功能 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\01.体验类和对象.py <__main__.Washer object at 0x0000018E2FAA67B0> 能洗衣服 Process finished with exit code 0
14.5 类里面的 self
self 指的是调用该函数的对象
# 类: 洗衣服 功能 洗衣服 class Washer(): def Wash(self): # 定义函数 自动出现 self print("洗衣服") print(self) # 打印 self 看看 self 是什么 haier = Washer() print(haier) # 打印对象的内存地址 haier.Wash() # 为了让 print(self) 执行, 调用对象 # 由于打印对象和打印 self 得到的内存地址相同, 所以 self 指的是调用该函数的对象, 运行中把 haier 对象地址传入函数中, self 得到 haier 对象地址 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day14\02.类里面的 self.py" <__main__.Washer object at 0x000001BB184367B0> 洗衣服 <__main__.Washer object at 0x000001BB184367B0> Process finished with exit code 0
14.6 一个类创建多个对象
# 基于同一个类创建两个对象,对象的内存地址是不同的 class Washer(): def Wash(self): print("洗衣服") print(self) # 打印调用对象的地址 haier1 = Washer() # 创建对象1 haier1.Wash() # 对象1 内存地址 <__main__.Washer object at 0x000001F177A367B0> print(haier1) haier2 = Washer() # 创建对象2 haier2.Wash() # 对象2 内存地址 <__main__.Washer object at 0x000001F17818D090> print(haier2) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\03.一个类创建多个对象.py 洗衣服 <__main__.Washer object at 0x00000250822767B0> <__main__.Washer object at 0x00000250822767B0> 洗衣服 <__main__.Washer object at 0x0000025082BBD090> <__main__.Washer object at 0x0000025082BBD090> Process finished with exit code 0
14.7 类外面添加对象属性
属性即是特征,比如:洗衣机的宽度、高度、重量......
对象属性既可以在类外面添加和获取,也能在类里面添加和获取
14.7.1 语法
# 语法 对象名.属性名 = 值
14.7.2 体验
class Washer(): def Wash(self): print("洗衣服") haier1 = Washer() # 添加属性 haier1.width = 500 haier1.height = 800
14.8 类外面获取对象属性
14.8.1 语法
# 语法 对象名.属性名
14.8.2 体验
class Washer(): def Wash(self): print("洗衣服") haier1 = Washer() # 添加属性 haier1.width = 500 haier1.height = 800 # 获取属性 print(f"haier1 洗衣机的宽度是 {haier1.width}") # 上面定义的 宽度属性 print(f"haier1 洗衣机的高度是 {haier1.height}") # 上面定义的 高度属性 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\04.外面对象属性.py haier1 洗衣机的宽度是 500 haier1 洗衣机的高度是 800 Process finished with exit code 0
14.9 类里面获取对象属性
14.9.1 语法
# 语法 self.属性名
14.9.2 体验
# 定义类 class Washer(): def Wash(self): print("洗衣服") # 类里面获取实例属性 print(f"洗衣机的宽度是 {self.width}") print(f"洗衣机的高度是 {self.height}") # 创建对象 haier1 = Washer() haier2 = Washer() # 添加 haier1 属性 haier1.width = 500 haier1.height = 800 # 添加 haier2 属性 haier2.width = 10 haier2.height = 20 haier1.Wash() # 不同对象, 可以添加不同属性 haier2.Wash() ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\05.里面对象属性.py 洗衣服 洗衣机的宽度是 500 洗衣机的高度是 800 洗衣服 洗衣机的宽度是 10 洗衣机的高度是 20 Process finished with exit code 0
14.10 体验魔法方法 int
在 Python 中, __xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数
思考:洗衣机的宽度高度是与生俱来的属性,可不可以在生产过程中就赋予这些属性呢?
答:理应如此 __init()__ 方法的作用:初始化对象
# 定义类 class Washer(): def __init__(self): # 魔法方法 self.width = 500 # 魔法方法中定义实例属性 self.height = 800 # 魔法方法中定义实例属性 def Wash(self): print("洗衣服") # 类里面获取魔法方法中的实例属性 print(f"洗衣机的宽度是 {self.width}") print(f"洗衣机的高度是 {self.height}") haier1 = Washer() haier1.Wash() # 魔法方法设置、调用、传递成功 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day14\06.体验魔法方法 int.py" 洗衣服 洗衣机的宽度是 500 洗衣机的高度是 800 Process finished with exit code 0
注意:
1.__init() 方法:在创建一个对象时默认被调用,不需要手动调用
2.__init__(self) 中的 self 参数,不需要开发者传递,python 解释器会自动把当前的对象引用传递过去
14.11 带参数的init代码书写(替换原11和12)
思考:一个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?
答:传参数
# 定义类 class Washer(): def __init__(self, width, height): # 魔法方法函数中设置形参 self.width = width # 传参 self.height = height # 传参 def Wash(self): print("洗衣服") # 类里面获取魔法方法中的传参的属性 print(f"洗衣机的宽度是 {self.width}") print(f"洗衣机的高度是 {self.height}") haier1 = Washer(10, 20) # 创建时自动调用 init, 因此传入参数, 实参会变成 self.width 等数据 haier1.Wash() haier2 = Washer(500, 800) haier2.Wash() # 当不传入参数时报错 # haier3 = Washer() # 报错没有传参:TypeError: Washer.__init__() missing 2 required positional arguments: 'width' and 'height' # haier3.Wash() ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\07.带参数的init代码.py 洗衣服 洗衣机的宽度是 10 洗衣机的高度是 20 洗衣服 洗衣机的宽度是 500 洗衣机的高度是 800 Process finished with exit code 0
14.12 魔法方法str
当使用 print 输出对象的时候,默认打印对象的内存地址,如果类定义了 __str__ 方法,那么就会打印存在这个方法中 return 的数据(打印内存地址对于用户和其他程序员作用不大,返回解释说明的文字更好)
class Washer1(): def __init__(self): # init 魔法方法 width = 200 class Washer2(): def __init__(self): # init 魔法方法 width = 200 def __str__(self): # str 魔法方法, 有返回值 return "解释说明:'类的说明或对象状态的说明'" haier1 = Washer1() print(haier1) # 无 str 魔法方法, 返回对象的内存地址 <__main__.Washer1 object at 0x00000218B56A67B0> haier2 = Washer2() print(haier2) # 有 str 魔法方法, 返回 return 值 解释说明:'类的说明或对象状态的说明' ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\08.魔法方法str.py <__main__.Washer1 object at 0x00000218B56A67B0> 解释说明:'类的说明或对象状态的说明' Process finished with exit code 0
14.13 魔法方法del
当删除对象时,python 解释器也会默认调用 __del__() 方法
class Washer(): def __init__(self): self.width = 200 print("对象自动创建") def __del__(self): print("对象已经删除") haier = Washer() # 基于类创建对象的时候, 对象初始自动调用 init, 对象结束自动调用 del ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\09.魔法方法del.py 对象自动创建 对象已经删除 Process finished with exit code 0
14.14 了解烤地瓜案例需求
需求主线:
1.被烤的时间和对应的地瓜状态:
0-3 分钟:生的
3-5 分钟:半生不熟
5-8 分钟:熟的
超过 8 分钟:烤糊了
2.添加的调料:
用户可以按自己的意愿添加调料
14.15 烤地瓜案例步骤分析
1.地瓜的属性:
(1)被烤的时间
(2)地瓜的状态
(3)添加的调料
2.地瓜的方法:
(1):被烤
用户根据意愿设定每次烤地瓜的时间
判断地瓜被烤的总时间是在哪个区间,修改地瓜状态
(2):添加调料
用户根据意愿设定添加的调料
将用户添加的调料存储
3.显示对象信息
14.16 烤地瓜init方法
# 1.定义类:初始化属性、被烤和添加调料的方法、显示对象信息的 str class SweetPotato: def __init__(self): self.cook_time = 0 # 初始化时间 self.cook_state = "生的" # 初始化状态, 以后随着被烤时间的变化, 状态也要发生变化 self.coodiments = [] # 初始化调料 调料使用列表, 因为调料可以放很多种
14.17 烤地瓜方法cook
# 1.定义类:初始化属性、被烤和添加调料的方法、显示对象信息的 str class SweetPotato: def __init__(self): # 1.1 初始化属性 self.cook_time = 0 # 初始化时间 self.cook_state = "生的" # 初始化状态, 以后随着被烤时间的变化, 状态也要发生变化 self.coodiments = [] # 初始化调料 调料使用列表, 因为调料可以放很多种 def Cook(self, time): # 1.2 被烤的方法 """ 烤地瓜的方法 """ # 函数说明文档 self.cook_time += time # 隔三差五抽出来看一下, 但里面烤地瓜的时间是要累计的 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 8 <= self.cook_time: self.cook_state = "烤糊了"
14.18 烤地瓜案例魔法方法str
# 1.定义类:初始化属性、被烤和添加调料的方法、显示对象信息的 str class SweetPotato: def __init__(self): # 1.1 初始化属性 self.cook_time = 0 # 初始化时间 self.cook_state = "生的" # 初始化状态, 以后随着被烤时间的变化, 状态也要发生变化 self.coodiments = [] # 初始化调料 调料使用列表, 因为调料可以放很多种 def Cook(self, time): # 1.2 被烤的方法 """ 烤地瓜的方法 """ # 函数说明文档 self.cook_time += time # 隔三差五抽出来看一下, 但里面烤地瓜的时间是要累计的 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 8 <= self.cook_time: self.cook_state = "烤糊了" def __str__(self): # 1.3 显示对象信息的 str return f"这个地瓜烤了{self.cook_time} 目前状态是 {self.cook_state}"
14.19 创建对象测试属性和方法
# 1.定义类:初始化属性、被烤和添加调料的方法、显示对象信息的 str class SweetPotato: def __init__(self): # 1.1 初始化属性 self.cook_time = 0 # 初始化时间 self.cook_state = "生的" # 初始化状态, 以后随着被烤时间的变化, 状态也要发生变化 self.coodiments = [] # 初始化调料 调料使用列表, 因为调料可以放很多种 def Cook(self, time): # 1.2 被烤的方法 """ 烤地瓜的方法 """ # 函数说明文档 self.cook_time += time # 隔三差五抽出来看一下, 但里面烤地瓜的时间是要累计的 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 8 <= self.cook_time: self.cook_state = "烤糊了" def __str__(self): # 1.3 显示对象信息的 str return f"这个地瓜烤了 {self.cook_time} 分钟,目前状态是 {self.cook_state}" # 2.创建对象并调用对应的实例方法 digua1 = SweetPotato() print(digua1) # 魔法方法 str 返回的时间属性和状态属性是默认的, 是初始时间和状态是 init digua1.Cook(2) # 使用对象中的 cook 方法, 相应状态会发生改变 print(digua1) digua1.Cook(2) print(digua1) digua1.Cook(2) print(digua1) digua1.Cook(2) print(digua1) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\10.烤地瓜案例.py 这个地瓜烤了 0 分钟,目前状态是 生的 这个地瓜烤了 2 分钟,目前状态是 生的 这个地瓜烤了 4 分钟,目前状态是 半生不熟 这个地瓜烤了 6 分钟,目前状态是 熟的 这个地瓜烤了 8 分钟,目前状态是 烤糊了 Process finished with exit code 0
14.20 烤地瓜添加调料
# 1.定义类:初始化属性、被烤和添加调料的方法、显示对象信息的 str class SweetPotato: def __init__(self): # 1.1 初始化属性 self.cook_time = 0 # 初始化时间 self.cook_state = "生的" # 初始化状态, 以后随着被烤时间的变化, 状态也要发生变化 self.coodiments = [] # 初始化调料 调料使用列表, 因为调料可以放很多种 def Cook(self, time): # 1.2 被烤的方法 """ 烤地瓜的方法 """ # 函数说明文档 self.cook_time += time # 隔三差五抽出来看一下, 但里面烤地瓜的时间是要累计的 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 8 <= self.cook_time: self.cook_state = "烤糊了" def Coodiments(self, coodiment): """ 添加调料 """ # 函数说明文档 self.coodiments.append(coodiment) # 用户添加调料, 可以添加多种 def __str__(self): # 1.3 显示对象信息的 str return f"这个地瓜烤了 {self.cook_time} 分钟,目前状态是 {self.cook_state}, 添加的调料有 {self.coodiments}" # 2.创建对象并调用对应的实例方法 digua1 = SweetPotato() print(digua1) # 魔法方法 str 返回的时间属性和状态属性是默认的, 是初始时间和状态是 init digua1.Cook(4) # 使用对象中的 cook 方法, 相应状态会发生改变 print(digua1) digua1.Coodiments("辣椒") print(digua1) digua1.Cook(4) # 因为程序运行中, 内存是没释放的,所以内存中列表内的值一直存在会添加列表数据 print(digua1) digua1.Coodiments("酱油") print(digua1) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\10.烤地瓜案例.py 这个地瓜烤了 0 分钟,目前状态是 生的, 添加的调料有 [] 这个地瓜烤了 4 分钟,目前状态是 半生不熟, 添加的调料有 [] 这个地瓜烤了 4 分钟,目前状态是 半生不熟, 添加的调料有 ['辣椒'] 这个地瓜烤了 8 分钟,目前状态是 烤糊了, 添加的调料有 ['辣椒'] 这个地瓜烤了 8 分钟,目前状态是 烤糊了, 添加的调料有 ['辣椒', '酱油'] Process finished with exit code 0
14.21 搬家具需求和步骤分析
需求:将小于房子剩余面积的家具摆放到房子中
步骤分析:需求涉及两个事物:房子 和 家具,故此案例涉及两个类:房子类 和 家具类
1.房子类:
(1)实例属性:
a.房子地理位置
b.房子占地面积
c.房子剩余面积
d.房子内家具列表
(2)实例方法:
a.容纳家具
(3)显示房屋信息
2.家具类:
(1)家具名称
(2)家具占地面积
14.22 搬家具之家具类
# 家具类 class Furniture(): def __init__(self, name, area): # 使用传参的方式, 可以不固定家具的名称、占地面积 self.name = name # 家具名称 self.area = area # 家具占地面积 bed = Furniture("双人床", 6) sofa = Furniture("沙发", 10)
14.23 搬家具之房屋类
# 家具类 class Furniture(): def __init__(self, name, area): # 使用传参的方式, 可以不固定家具的名称、占地面积 self.name = name # 家具名称 self.area = area # 家具占地面积 # 房屋类 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}" # 家具对象 bed = Furniture("双人床", 6) sofa = Furniture("沙发", 10) # 房屋对象 home1 = Home("北京", 1000) print(home1) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\11.搬家具案例.py 房子坐落于 北京,占地面积 1000, 剩余面积 1000,家具有 [] Process finished with exit code 0
14.24 搬家具之添加容纳家具思路分析
class ........ def add_furniture(self, item): # 一个 item 形参,需要用到两个参数 家具名称和家具面积 ........
这里一个 item 是一个形参,为什么会笃定里面有两个参数呢?
答:房屋对象使用 add_furniture方法 使用的是引用,引用家具类的对象,而家具类的对象里面定义了两个属性,即:name、area ,所以是房屋对应使用引用,引用中有两个值
14.25 搬家具之容纳家具函数
# 家具类 class Furniture(): def __init__(self, name, area): # 使用传参的方式, 可以不固定家具的名称、占地面积 self.name = name # 家具名称 self.area = area # 家具占地面积 # 房屋类 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}" def add_furniture(self, item): # 一个 item 形参,需要用到两个参数 家具名称和家具面积 """ 容纳家具 """ if self.free_area > item.area: # 判断房屋剩余面积大于家具面积,再装入 self.furniture.append(item.name) # 可以装入, 加入到家具列表 self.free_area -= item.area # 房屋剩余面积减去装入家具面积 else: print(f"{item.name} 家具太大, 剩余面积 {self.free_area} 不足,无法容纳") # 为什么这里不使用 return, 因为 return 直接结束, 不会再调用魔法方法 __str__ # 家具对象 bed = Furniture("双人床", 6) sofa = Furniture("沙发", 10) # 房屋对象 home1 = Home("北京", 1000) print(home1) home1.add_furniture(sofa) # 将 sofa 传入房屋对象, sofa 这里是引用 sofa对象 print(home1) home1.add_furniture(bed) print(home1) card = Furniture("篮球场", 2000) # 使用家具对象创建不能搬入的情况 home1.add_furniture(card) # 加入房屋对象 print(home1) # 这里就是 else print 的好处, 打印 提示信息, 还会返回 return 信息,如果将 print 改为 return, str 里面的 return 将不会提示 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day14\11.搬家具案例.py 房子坐落于 北京,占地面积 1000, 剩余面积 1000,家具有 [] 房子坐落于 北京,占地面积 1000, 剩余面积 990,家具有 ['沙发'] 房子坐落于 北京,占地面积 1000, 剩余面积 984,家具有 ['沙发', '双人床'] 篮球场 家具太大, 剩余面积 984 不足,无法容纳 房子坐落于 北京,占地面积 1000, 剩余面积 984,家具有 ['沙发', '双人床'] Process finished with exit code 0
14.26 面向对象基础部分总结
1.面向对象重要组成部分
(1)类
创建类
class 类名(): 代码 ......
(2)对象
对象名 = 类名()
2.添加对象属性
(1)类外面
对象名.属性名 = 值
(2)类里面
self.属性名 = 值
3.获取对象属性
(1)类外面
对象名.属性名
(2)类里面
self.属性名
4.魔法方法:即特殊功能的函数,以类创建对象时各阶段自动调用
(1)__init__:初始化
(2)__str__:输出对象信息
(3)__del__:删除对象时调用
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习
浙公网安备 33010602011771号