【Qwen3-Max:】太棒了!欢迎来到 【跟着AI学Python】第15天!🎉今天我们将开启 面向对象编程(OOP) 的大门——这是 Python 构建大型、可维护、可复用系统的核心范式!
💡 OOP 不是“高级技巧”,而是组织复杂逻辑的思维方式。从今天起,你将学会用“类”来建模现实世界,让代码更清晰、更模块化、更易扩展!
🎯 第15天目标:
✅ 理解 类(Class)与对象(Object) 的关系✅ 掌握 __init__ 构造方法初始化对象✅ 区分 实例属性 与 实例方法✅ 用 OOP 重构第14天的通讯录(预告!)
📘 一、为什么需要 OOP?
想象你要管理多个联系人:
- 过程式写法:用字典列表 → 逻辑分散,操作与数据分离
- OOP 写法:每个联系人是一个 对象,自带数据 + 行为 → 高内聚、低耦合
✅ OOP 四大支柱(今天聚焦前两个):
- 封装(Encapsulation):数据 + 操作打包在一起
- 抽象(Abstraction):隐藏内部细节,暴露简洁接口
📘 二、类(Class) vs 对象(Object)
🔹 定义一个简单的类
class Dog: """狗类""" def __init__(self, name, breed): # 实例属性:每个对象独有 self.name = name # 名字 self.breed = breed # 品种 # 实例方法:操作该对象的数据 def bark(self): return f"{self.name} 汪汪叫!" def info(self): return f"名字: {self.name}, 品种: {self.breed}"
🔹 创建对象(实例化)
# 创建两个 Dog 对象dog1 = Dog("旺财", "土狗")dog2 = Dog("Buddy", "金毛")print(dog1.info()) # 名字: 旺财, 品种: 土狗print(dog2.bark()) # Buddy 汪汪叫!
✅ 关键点:
📘 三、__init__:构造方法(Constructor)
🔹 示例:带默认值的构造器
class Person: def __init__(self, name, age=0): self.name = name self.age = age # 默认年龄为 0p1 = Person("Alice") # age=0p2 = Person("Bob", 30) # age=30
⚠️ 注意:__init__没有返回值(不能写 return)
📘 四、实例属性 vs 类属性
| | | |
|---|
| 实例属性 | __init__ | | self.name |
| 类属性 | | | species = "人类" |
🔹 示例
class Car: wheels = 4 # 类属性:所有车都有4个轮子 def __init__(self, brand): self.brand = brand # 实例属性:品牌各不相同car1 = Car("Toyota")car2 = Car("BMW")print(car1.wheels) # 4print(Car.wheels) # 4(通过类访问)# 修改类属性 → 所有对象受影响Car.wheels = 6print(car1.wheels) # 6
✅ 最佳实践:
📘 五、实例方法(Instance Methods)
🔹 示例:银行账户
class BankAccount: def __init__(self, owner, balance=0): self.owner = owner self.balance = balance def deposit(self, amount): """存款""" if amount > 0: self.balance += amount print(f"✅ 存入 {amount},余额: {self.balance}") else: print("❌ 存款金额必须大于0") def withdraw(self, amount): """取款""" if 0 < amount <= self.balance: self.balance -= amount print(f"✅ 取出 {amount},余额: {self.balance}") else: print("❌ 余额不足或金额无效")# 使用acc = BankAccount("Alice", 100)acc.deposit(50) # ✅ 存入 50,余额: 150acc.withdraw(200) # ❌ 余额不足
💻 今日实战:用 OOP 重构“联系人”
我们将第14天的字典联系人升级为 Contact 类!
class Contact: """联系人类""" def __init__(self, name, phone="", email=""): self.name = name self.phone = phone self.email = email def __str__(self): """定义对象的字符串表示(用于 print)""" return f"{self.name} | {self.phone} | {self.email}" def to_dict(self): """转换为字典(便于保存到 JSON)""" return { "name": self.name, "phone": self.phone, "email": self.email } @classmethod def from_dict(cls, data): """从字典创建 Contact 对象(便于从 JSON 加载)""" return cls(data["name"], data["phone"], data["email"])# 测试contact = Contact("Alice", "13800138000", "alice@example.com")print(contact) # Alice | 13800138000 | alice@example.com# 保存/加载data = contact.to_dict()restored = Contact.from_dict(data)print(restored == contact) # False(不同对象),但内容相同
🔑 新知识点:
__str__:自定义 print(obj) 的输出@classmethod:类方法(明天详解),用于替代构造器
✅ 今日小任务
- 创建
Rectangle 类,包含属性 width, height,方法 area()计算面积。
思考题:为什么方法的第一个参数必须是 self?💡 答案:Python 自动将 调用对象 作为第一个参数传入。obj.method() 实际等价于 Class.method(obj)。self 是约定俗成的名称(也可叫 this,但不推荐)。
📝 小结
| |
|---|
| 类(Class) | |
| 对象(Object) | |
__init__ | |
| 实例属性 | self.xxx |
| 实例方法 | |
✅ OOP 编程习惯:
- 方法/属性用 小写+下划线(
get_balance)
🎉 恭喜完成第15天!你已经掌握了 面向对象编程的基础核心!
明天我们将学习 继承(Inheritance)与多态(Polymorphism),让代码复用达到新高度!🧠
继续加油,你的代码正变得越来越“面向对象”!🧱✨