🎯 学习目标
- 理解面向对象的核心概念:类是图纸,对象是按图纸造出的实物
- 掌握类的定义语法:
class、__init__、self - 理解
self的本质:代表对象自己,访问属性和方法必须加self - 能区分 实例属性(每个对象独有)和 实例方法(对象的行为)
- 能用类封装简单的功能模块,如一个大模型调用的客户端类
一、为什么需要面向对象?
- 从"动词"思维到"名词"思维
# 面向过程:函数操作散落的数据dog1_name = "旺财"defbark1(name): print(f"{name}:汪汪!")# 面向对象:数据和行为封装在一起classDog:defbark(self): print(f"{self.name}:汪汪!")
- 面向过程:关注步骤——先做什么,再做什么(前面的函数式写法)
- 面向对象:关注谁来做——把数据和操作数据的方法打包在一起
二、定义类与创建对象
- 基本语法
classDog:"""这是一个狗的类"""# 类文档pass# 创建对象(实例化)dog1 = Dog()dog2 = Dog()print(type(dog1)) # <class '__main__.Dog'>
__init__ 方法:初始化(构造方法)classDog:def__init__(self, name, age):# self.属性名 = 参数 self.name = name # 实例属性 self.age = age print(f"{name}出生了!")dog1 = Dog("旺财", 3) # 旺财出生了!自动调用 __init__dog2 = Dog("小白", 1) # 小白出生了!
三、self:代表对象自己
- 为什么要用
self?classDog:def__init__(self, name): self.name = namedefbark(self):# 通过 self 访问当前对象的属性 print(f"{self.name}:汪汪!")dog1 = Dog("旺财")dog2 = Dog("小白")dog1.bark() # 旺财:汪汪! self 是 dog1dog2.bark() # 小白:汪汪! self 是 dog2
- Python 用
self告诉方法:"你在操作哪个对象的数据"
self本质上是对象的引用# dog1.bark() 实际上等价于:Dog.bark(dog1)
四、实例属性与实例方法
- 实例属性:每个对象各自拥有的数据
classStudent:def__init__(self, name, score): self.name = name self.score = scores1 = Student("小王", 92)s2 = Student("小李", 85)print(s1.score) # 92print(s2.score) # 85# 可以动态添加属性(但不推荐)s1.city = "北京"
- 实例方法:对象的行为
classStudent:def__init__(self, name, score): self.name = name self.score = scoredefget_grade(self):if self.score >= 90:return"A"elif self.score >= 80:return"B"else:return"C"defstudy(self, hours): self.score = min(100, self.score + hours * 2) print(f"{self.name}学习了{hours}小时,分数变为{self.score}")s1 = Student("小王", 88)print(s1.get_grade()) # Bs1.study(3) # 小王学习了3小时,分数变为94print(s1.get_grade()) # A
五、实战:封装大模型客户端类
classChatClient:"""模拟大模型聊天客户端"""def__init__(self, model_name, api_key): self.model_name = model_name self.api_key = api_key self.history = [] # 每个客户端有自己的历史记录defsend_message(self, user_input):# 模拟发送请求 print(f"[{self.model_name}] 发送消息:{user_input}") self.history.append({"role": "user", "content": user_input})# 模拟API返回 reply = f"收到!你说的是:{user_input}" self.history.append({"role": "assistant", "content": reply})return replydefshow_history(self):for msg in self.history: print(f" {msg['role']}: {msg['content']}")# 使用client = ChatClient("gpt-3.5-turbo", "sk-xxx")client.send_message("你好!")client.send_message("今天天气怎么样?")client.show_history()
⚠️ 常见坑
- 忘记写
selfclassDog:def__init__(name):# ❌ 忘记 selfpass# TypeError: __init__() takes 1 positional argument but 2 were givendef__init__(self, name):# ✅ self.name = name
- 调用方法时手动传
selfdog1 = Dog("旺财")# dog1.bark(dog1) # ❌ 不需要传 selfdog1.bark() # ✅ Python 自动传
- 在
__init__ 外面直接定义属性classDog:# name = "旺财" # 这是类属性,所有对象共享!def__init__(self, name): self.name = name # ✅ 实例属性,每个对象独立
✍️ 实战练习
- 要求:创建
BankAccount类,有owner、balance 属性,有deposit()、withdraw()、check_balance() 方法。 - 示例:
classBankAccount:def__init__(self, owner, balance=0): self.owner = owner self.balance = balancedefdeposit(self, amount): self.balance += amount print(f"存入{amount},余额{self.balance}")defwithdraw(self, amount):if amount > self.balance: print("余额不足!")else: self.balance -= amount print(f"取出{amount},余额{self.balance}")defcheck_balance(self): print(f"{self.owner}的余额:{self.balance}")acc = BankAccount("小王", 1000)acc.deposit(500)acc.withdraw(200)acc.check_balance()
✅ 自测清单
- [ ] 能用
class 定义类,用__init__初始化属性 - [ ] 理解
self代表对象自己,访问属性和方法必须加self - [ ] 能区分实例属性(每个对象独立)和类属性(所有对象共享)
- [ ] 能用类封装带状态的功能(如带历史的聊天客户端)