一、面向对象
为了方便了解,我们拿面向过程做一个对比
例如:肚子饿了,想吃饭
面向过程:去超市---买菜---卖肉---买米---回家---洗菜---切肉---炒菜---煮米饭---盛饭---开吃
面向对象:点外卖
总结:⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使⽤的,不⽤去管他内部的情况。⽽编程就是设置事物能够做什么事。
二、类和对象
思考:打电话需要用手机,这个手机就是一个对象,这个对象哪来的呢?
答:它是制造出来的
思考:怎么制造的?
答:先构思图纸,再生产
在⾯向对象编程过程中,有两个重要组成部分:类 和 对象。
类和对象的关系:⽤类去创建⼀个对象。
1.理解类和对象
类
类是对⼀系列具有相同**特征**和**⾏为**的事物的统称,是⼀个**抽象的概念**,不是真实存在的事物
- 特征即是属性
- ⾏为即是⽅法
类⽐如是制造手机时要⽤到的图纸,也就是说**类是⽤来创建对象**的
对象
对象是类创建出来的真实存在的事物,例如:手机。
>注意:开发中,先有类,再有对象。
⾯向对象实现⽅法
class 类名(): 代码 pass
注意:类名要满⾜标识符命名规则,同时遵循驼峰命名习惯
class My_Project(): print("我是第一个类")
2.创建对象
语法:变量名 = 类名()
class My_Phone(): def call_tel(self): print("正在打电话") def play_game(self): print("正在打游戏")
# 创建对象 apple = My_Phone() print(apple) # 调用对象的实例方法 apple.play_game()
创建对象的过程也叫实例化对象.
3.添加和获取对象属性
- 属性即是特征,⽐如:手机的颜色,大小,重量...
- 对象属性既可以在类外⾯添加和获取,也能在类⾥⾯添加和获取。
self:
self
是 Python 中的一个特殊参数,用于引用对象本身。在类的方法中,第一个参数通常都是 self
,用来指代调用该方法的对象本身。
当你调用类的方法时,Python 会自动将调用该方法的对象传递给 self
参数。这样,在方法内部就可以通过 self
来访问对象的属性和其他方法。
- self代表类的实例
- 类的方法与普通的函数只有一个特别的区别------它们必须有一个额外的**第一个参数名称**, 按照惯例它的名称是 self。
类外⾯添加对象属性
语法:对象名.属性名 = 值
class My_Phone(): def main(self): pass apple = My_Phone() apple.width = 10 apple.heigth = 15 print(apple.width) print(apple.heigth)
类里面获取对象属性
语法:self.属性名
class My_Phone(): def main(self): print(self.width) print(self.heigth) apple = My_Phone() apple.width = 10 apple.heigth = 15 apple.main()
4.魔术方法( __ xx__())
在Python中,__ xx__() 的函数叫做魔法⽅法,指的是具有特殊功能的函数。
init()
init() :初始化对象
比如:手机的尺寸大小生来就有,那么能不能在生产之前就赋予属性呢?
class My_Phone(): def __init__(self): self.width = 10 self.heigth = 15 def main(self): print(self.width) print(self.heigth) apple = My_Phone()
______init______() ⽅法,在创建⼀个对象时默认被调⽤,不需要⼿动调⽤
________init________(self) 中的self参数,不需要开发者传递,python解释器会⾃动把当前的对象引⽤传递过去。
5.带参数的init
⼀个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?
传参即可
class My_Phone(): def __init__(self,width,heigth): self.width = width self.heigth = heigth def apple_phont(self): print("苹果手机的宽为:",self.width) print("苹果手机的高为:",self.heigth) def huawei_phont(self): print("华为手机的宽为:",self.width) print("华为手机的高为:",self.heigth) apple = My_Phone(10,20) apple.apple_phont()
6.str()
当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 __str__ ⽅法,那么就会打印从在这个⽅法中 return 的数据。
class Demo(): def __init__(self, width, heigth): self.width = width self.heigth = heigth def __str__(self): return f"你这个手机的宽是{self.width},高度是{self.heigth}" a = Demo(10,20) print(a)
>> 你这个手机的宽是10,高度是20
7.类属性与方法
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问.
class Demo(): __num = 0 # 私有属性 result = 0 # 公开属性 def count(self): self.__num += 1 self.result += 1 print(self.__num) run = Demo() run.count() run.count() print(run.result) print(run.__num) # 报错,实例不能访问私有变量
三、综合应用-烤地瓜
1.逻辑分析
需求涉及⼀个事物: 地⽠,故案例涉及⼀个类:地⽠类
* **地⽠的属性**
--- 被烤的时间
--- 地⽠的状态
--- 添加的调料
* **地⽠的⽅法**
**被烤**
--- ⽤户根据意愿设定每次烤地⽠的时间
--- 判断地⽠被烤的总时间是在哪个区间,修改地⽠状态
**添加调料**
--- ⽤户根据意愿设定添加的调料
--- 将⽤户添加的调料存储
* **显示对象信息**
### 需求
1、被烤的时间和对应的地⽠状态:
0 - 5分钟 : ⽣的
5 - 10分钟 : 半⽣不熟
10-12分钟 : 烤熟了
超过12分钟: 烤糊了
2、添加调料:
2.代码实现
class Test_Potato(): def __init__(self): # 初始化属性:考的时间 self.cook_time = 0 # 初始化属性:考的状态 self.cook_sratic = "生的" # 初始化属性:放的调料 self.cook_seasoning = [] def cook(self, time): # 烤地瓜的时间,并根据时间修改地瓜的状态 self.cook_time += time if 0 <= self.cook_time < 5: self.cook_sratic = "生的" if 5 <= self.cook_time < 10: self.cook_sratic = "半生半熟" if 10 <= self.cook_time <= 12: self.cook_sratic = "熟了" if self.cook_time > 12: self.cook_sratic = "烤糊了" def add_seasoning(self,*seasoning): # 添加调料 self.cook_seasoning.append(seasoning) def __str__(self): # 返回地瓜的状态、考烤时间和添加的调料 return f"当前地瓜烤了--{self.cook_time}--分钟,他的状态是--{self.cook_sratic}--,添加的调料是--{self.cook_seasoning}" if __name__ == '__main__': main = Test_Potato() main.cook(11) # 地瓜烤了11分钟 main.add_seasoning("辣椒","花生","孜然") # 添加辣椒、花生、孜然调料 print(main) # 打印地瓜的状态、烤的时间和添加的调料