Python面向对象编程教程:类与实例

Python作为一门灵活的多范式语言,同时支持面向过程、函数式和面向对象(OOP)编程。其中,OOP是构建复杂、可维护代码的核心方式,而类(Class)实例(Instance)则是OOP最基础、最重要的两个概念。


1. 核心概念扫盲:什么是类?什么是实例?

先举个生活化的小例子:

  • 汽车的设计图纸是「类」——它抽象定义了“所有汽车都有品牌、颜色、轮子”,“所有汽车都能启动、刹车、鸣笛”;
  • 停在楼下的那辆红色特斯拉Model 3是「实例」——它是设计图纸的具体产物,有自己专属的品牌、颜色、车牌号,能执行图纸里的所有动作。

对应到编程世界:

  • :是抽象的「数据+行为模板」,数据叫「属性」,行为叫「方法」;
  • 实例:是根据模板生成的「具体对象」,每个实例的属性可以完全独立,但共享模板里的所有方法。

2. 从零定义一个类

Python用 class 关键字定义类,现代Python(3.x)所有类默认继承自 object,无需显式写出来:

# 定义最简单的学生类(空模板)
class Student:
    pass  # pass是占位符,防止语法报错

3. 用类「生成」具体实例

直接用类名+圆括号的方式创建实例,类似调用函数:

# 创建两个学生实例
bart = Student()
lisa = Student()

# 输出结果可以看出,两个实例是独立的内存地址
print(bart)    # <__main__.Student object at 0x7f9a1c...>
print(lisa)    # <__main__.Student object at 0x7f9a1d...>
# 而类本身是一个类型对象
print(Student) # <class '__main__.Student'>

4. 给实例「绑定属性」:用 __init__ 初始化

空的类模板生成的空实例没什么用,我们需要在创建时给它预设初始属性——这时候就要用到Python的特殊方法 __init__(前后各两个下划线,又称「魔法方法」或「构造函数」)。

4.1 构造函数的写法与注意事项

class Student:
    # __init__在实例创建时自动执行
    def __init__(self, name, score):
        # self是**必须放在第一个**的参数,代表「当前正在创建的实例本身」
        # 给self绑定属性,就相当于给实例绑定专属属性
        self.name = name
        self.score = score

注意这几个关键点:

  1. 魔法方法的命名:严格是 __init__(双下划线开头+结尾),不能少也不能错;
  2. self的作用:调用时Python会自动传入,我们不用手动传
  3. 参数匹配:创建实例时,除了self,后面的参数必须一一对应。

4.2 测试构造函数

# 传入两个匹配的参数
bart = Student('Bart Simpson', 59)
print(bart.name)  # 直接通过实例访问属性 → Bart Simpson
print(bart.score) # → 59

5. 给实例「添加能力」:定义实例方法

类里的函数叫「方法」,分为实例方法、类方法、静态方法——最常用的是实例方法,它的第一个参数也必须是 self,用来访问当前实例的属性。

5.1 写一个打印成绩的方法

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    
    # 实例方法:打印当前学生的姓名+分数
    def print_score(self):
        print(f"{self.name} 的分数是 {self.score}")

5.2 调用实例方法

调用实例方法时,同样不用传self,Python会自动把实例绑定到self上:

bart = Student('Bart Simpson', 59)
bart.print_score()  # → Bart Simpson 的分数是 59

6. OOP的核心优势:数据封装

面向过程编程中,数据和操作是分离的,很容易出现数据被意外修改的问题;而OOP的数据封装,把「属性」和「操作属性的方法」绑定在同一个类里,从逻辑上隔离了数据和外部,更安全。

6.1 封装后的成绩等级计算

比如我们可以给学生类加一个「根据分数算等级」的方法,用户不需要直接操作分数,只需要调用方法就行:

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    
    def print_score(self):
        print(f"{self.name} 的分数是 {self.score}")
    
    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

6.2 测试封装效果

lisa = Student('Lisa Simpson', 99)
bart = Student('Bart Simpson', 59)

# 用户只需要调用get_grade,不用知道内部的判断逻辑
print(lisa.name, lisa.get_grade()) # → Lisa Simpson A
print(bart.name, bart.get_grade()) # → Bart Simpson C

7. Python的灵活特性:动态属性

和C++/Java等静态语言不同,Python允许动态给单个实例添加/删除属性,这些属性只属于该实例,和类、其他实例无关。

7.1 给单个实例加属性

bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)

# 只给bart添加age属性
bart.age = 8
print(bart.age)  # → 8

# lisa没有age属性,访问会报错
print(lisa.age)  # → AttributeError: 'Student' object has no attribute 'age'

7.2 注意事项

动态属性虽然方便,但容易导致代码逻辑混乱,不建议在生产环境中频繁使用,如果属性是通用的,最好还是放在 __init__ 里统一初始化。


8. 现代Python的最佳实践

8.1 命名规范

  • 类名:用「大驼峰式」(单词首字母大写,不分割),比如 StudentUniversityStudent
  • 实例名/函数名/方法名:用「小写下划线式」(全小写,单词用下划线分割),比如 bart_simpsonget_student_grade

8.2 添加类型提示

Python 3.5+ 支持类型提示(Type Hints),虽然不会强制检查,但可以提高代码可读性,也方便IDE自动补全和静态代码分析工具(如mypy)检查:

class Student:
    """学生类,管理学生的基本信息和成绩"""
    
    def __init__(self, name: str, score: float):
        """初始化学生实例
        
        Args:
            name: 学生的姓名(字符串)
            score: 学生的考试分数(浮点数/整数)
        """
        self.name = name
        self.score = score
    
    def print_score(self) -> None:
        """打印学生的姓名和分数(无返回值)"""
        print(f"{self.name} 的分数是 {self.score}")
    
    def get_grade(self) -> str:
        """根据分数返回等级(A/B/C字符串)
        
        Returns:
            A: 90分及以上
            B: 60-89分
            C: 60分以下
        """
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

9. 总结

本文快速入门了Python OOP的两个核心概念:

  1. 类是抽象模板,定义属性和方法;
  2. 实例是具体对象,有独立属性,共享类方法;
  3. __init__构造函数用来初始化实例属性;
  4. 数据封装把属性和方法绑定,提高安全性和可读性;
  5. 动态属性是Python的灵活特性,但要谨慎使用。

掌握类和实例,是深入学习Python OOP(继承、多态、私有属性等)的基础,后面我们会继续介绍更多进阶内容!