当前位置:首页>python>【跟着AI学Python】第15天:面向对象编程(OOP)基础

【跟着AI学Python】第15天:面向对象编程(OOP)基础

  • 2026-08-24 19:24:43
【跟着AI学Python】第15天:面向对象编程(OOP)基础

【Qwen3-Max:】太棒了!欢迎来到 【跟着AI学Python】第15天!🎉今天我们将开启 面向对象编程(OOP) 的大门——这是 Python 构建大型、可维护、可复用系统的核心范式!

💡 OOP 不是“高级技巧”,而是组织复杂逻辑的思维方式。从今天起,你将学会用“类”来建模现实世界,让代码更清晰、更模块化、更易扩展!


🎯 第15天目标:

✅ 理解 类(Class)与对象(Object) 的关系✅ 掌握 __init__ 构造方法初始化对象✅ 区分 实例属性 与 实例方法✅ 用 OOP 重构第14天的通讯录(预告!)


📘 一、为什么需要 OOP?

想象你要管理多个联系人:

  • 过程式写法:用字典列表 → 逻辑分散,操作与数据分离
  • OOP 写法:每个联系人是一个 对象,自带数据 + 行为 → 高内聚、低耦合

✅ OOP 四大支柱(今天聚焦前两个):

  • 封装(Encapsulation):数据 + 操作打包在一起
  • 抽象(Abstraction):隐藏内部细节,暴露简洁接口
  • 继承(Inheritance) ← 第16天
  • 多态(Polymorphism) ← 第17天

📘 二、类(Class) vs 对象(Object)

概念
说明
类比
类(Class)
蓝图 / 模板
“汽车设计图”
对象(Object)
类的实例
“一辆具体的特斯拉 Model 3”

🔹 定义一个简单的类

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 汪汪叫!

✅ 关键点:

  • self代表当前对象本身(必须作为第一个参数)
  • 属性通过 self.xxx 定义和访问
  • 方法通过 对象.方法名() 调用

📘 三、__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.xxx
每个对象独有
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)

  • 操作当前对象的数据
  • 第一个参数必须是 self

🔹 示例:银行账户

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:类方法(明天详解),用于替代构造器

✅ 今日小任务

  1. 创建 Rectangle 类,包含属性 width, height,方法 area()计算面积。
思考题:为什么方法的第一个参数必须是 self?

💡 答案:Python 自动将 调用对象 作为第一个参数传入。obj.method() 实际等价于 Class.method(obj)。self 是约定俗成的名称(也可叫 this,但不推荐)。


📝 小结

概念
说明
类(Class)
对象的蓝图,定义属性和方法
对象(Object)
类的实例,拥有具体数据
__init__
构造方法,初始化实例属性
实例属性self.xxx
,每个对象独有
实例方法
第一个参数是 self,操作当前对象

✅ OOP 编程习惯:

  • 类名用 大驼峰命名(BankAccount)
  • 方法/属性用 小写+下划线(get_balance)
  • 用 __str__ 提供友好的打印格式

🎉 恭喜完成第15天!你已经掌握了 面向对象编程的基础核心!

明天我们将学习 继承(Inheritance)与多态(Polymorphism),让代码复用达到新高度!🧠

继续加油,你的代码正变得越来越“面向对象”!🧱✨

最新文章

随机文章