Python: 类与对象

最后更新:2026-09-22

前几课我们用函数组织代码,这是"面向过程"的方式——关注"做什么"。而面向对象编程(OOP)关注的是"谁来做"——把数据和操作数据的方法打包成一个对象。Python 一切皆对象,理解 OOP 是进阶的关键一步。


1. 什么是类和对象

类(class)是模板,对象(object)是根据模板创建的具体实例。

PYTHON
# 定义一个"狗"的类——就是模板
class Dog:
    pass

# 根据模板创建具体的"狗"对象
my_dog = Dog()
print(type(my_dog))         # <class '__main__.Dog'>
print(my_dog)               # <__main__.Dog object at 0x...>

就像"狗"这个品种是一个概念(类),你家养的那条叫旺财的狗(对象)是具体的实例。一个类可以创建无数个对象。

💡 现实类比: 类是"设计图纸",对象是"按图纸造出来的实物"。一张图纸可以造很多个实物,每个实物有自己的状态(比如不同的狗有不同的名字和年龄)。



2. __init__:构造方法

当创建对象时,__init__ 方法会自动被调用,用来初始化对象的属性:

PYTHON
class Dog:
    """狗类"""
    def __init__(self, name, age):
        self.name = name    # 实例属性
        self.age = age

# 创建对象时传入参数
dog1 = Dog("旺财", 3)
dog2 = Dog("小白", 1)

print(dog1.name)            # 旺财
print(dog2.name)            # 小白
print(dog1.age)             # 3

❗注意: __init__ 不是构造函数——对象已经创建好了才调用它。真正的构造函数是 __new__,但日常几乎不需要动它。__init__ 的第一个参数永远是 self,代表当前对象实例。

▶ 示例:定义学生类(难度⭐)

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功


3. 方法:对象的行为

类中定义的函数叫方法,第一个参数永远是 self——代表调用这个方法的对象本身。

PYTHON
class Calculator:
    """简单计算器"""
    def __init__(self):
        self.result = 0
    
    def add(self, value):
        self.result += value
        return self
    
    def subtract(self, value):
        self.result -= value
        return self
    
    def show(self):
        return self.result

calc = Calculator()
calc.add(10)
calc.subtract(3)
print(calc.show())                  # 7

# 方法链式调用——因为每个方法都返回 self
result = Calculator().add(10).subtract(3).add(5).show()
print(result)                       # 12
💡 链式调用的技巧: 方法返回 self 就可以连续调用了。很多 Python 库(如 pandas)大量使用这个模式。



4. 实例属性 vs 类属性

属性可以定义在实例上(每个对象独有),也可以定义在类上(所有对象共享):

PYTHON
class Student:
    # 类属性——所有学生共享
    school = "第一中学"
    total_count = 0
    
    def __init__(self, name):
        # 实例属性——每个学生独有
        self.name = name
        Student.total_count += 1

s1 = Student("Alice")
s2 = Student("Bob")

# 类属性通过类名访问
print(Student.school)       # 第一中学
print(Student.total_count)  # 2

# 也可以通过实例访问(如果实例没有同名属性)
print(s1.school)            # 第一中学
print(s2.school)            # 第一中学

# 修改类属性会影响所有实例
Student.school = "第二中学"
print(s1.school)            # 第二中学

▶ 示例:银行账户(难度⭐⭐)

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功


▶ 示例:学生成绩管理类(难度⭐⭐)

▶ 试一试

输出:

TEXT 📖 仅展示
学生:Alice(001)
  语文:85分(及格)
  数学:72分(及格)
  英语:90分(及格)
  平均分:82.3

学生:Bob(002)
  语文:55分(不及格)
  数学:48分(不及格)
  平均分:51.5

全校学生数:2


5. 常见应用场景


❓ 常见问题

Q 方法和函数有什么区别?
A 方法就是在类中定义的函数,第一个参数是 self。函数可以独立存在,方法必须通过对象或类调用。本质上方法也是函数,只是 Python 自动把调用者作为第一个参数传进去。
Q self 可以改成其他名字吗?
A 技术上可以,但绝对不要改。self 是 Python 社区的铁律。改成其他名字虽然能运行,但所有读你代码的人(包括未来的你)都会觉得奇怪。坚持用 self。
Q 什么时候用类,什么时候用函数?
A 如果你需要维护状态(数据),用类——比如银行账户要记住余额。如果你只是做一次计算(输入→处理→输出),用函数——比如温度转换。一个简单的经验法则:如果只需要 1-2 个函数,用函数就够了;如果需要多个相关函数共享同一份数据,用类。

📖 小节


📝 作业

  1. 基础题(难度⭐):定义一个 Car 类,有 brand、color、speed 属性,有 accelerate(value) 加速方法和 show_speed() 显示速度的方法。

  2. 进阶题(难度⭐⭐):定义一个 Student 类,用类属性统计学生总数,用实例属性记录每个学生的姓名和成绩。实现 get_grade() 方法返回等级(ABCD)。

  3. 挑战题(难度⭐⭐⭐):定义一个 Library 类和 Book 类。Book 有标题、作者、是否借出状态。Library 有 add_book(book)、borrow(title)、return_book(title)、show_books() 四个方法。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏