【Python 进阶】一文吃透类与对象:从概念到实战

前言

Python 作为一门面向对象的编程语言(OOP),类(Class)与对象(Object)是其核心基石。无论是日常开发中的模块封装,还是大型项目的架构设计,都离不开类与对象的灵活运用。本文将从零基础视角出发,带你彻底搞懂类与对象的基本概念、核心用法,并通过实战案例加深理解,适合 Python 入门到进阶阶段的开发者学习。

一、核心概念:什么是类与对象?

1.1 类(Class):事物的抽象模板

类是对一类具有相同属性和行为的事物的抽象描述,相当于一个 “模板” 或 “蓝图”。

举个生活中的例子:

  • “汽车” 可以看作一个类
  • 所有汽车都有品牌、颜色、价格(属性)
  • 所有汽车都能启动、行驶、刹车(行为 / 方法)

在 Python 中,类定义了这类事物有什么(属性)能做什么(方法),但并不特指某一个具体的事物。

1.2 对象(Object):类的具体实例

对象是类的具体实现,是根据类模板创建出来的 “具体事物”,也称为 “实例(Instance)”。

延续上面的例子:

  • “张三的黑色特斯拉 Model 3” 是 “汽车” 类的一个对象
  • “李四的白色比亚迪汉” 是 “汽车” 类的另一个对象

每个对象都拥有类定义的属性和方法,且属性值可以不同(比如颜色、价格)。

1.3 核心关系

plaintext

类(模板)→ 实例化 → 对象(具体事物)
对象 → 归属 → 类

二、Python 中类与对象的基础用法

2.1 定义类:class 关键字

Python 中使用class关键字定义类,语法格式如下:

python

运行

class 类名:
    # 类的属性(变量)
    # 类的方法(函数)

命名规范

  • 类名采用大驼峰命名法(每个单词首字母大写,无下划线),如CarPerson
  • 避免使用 Python 内置关键字(如intstr)作为类名

2.2 创建对象:实例化

定义类后,通过类名()的方式创建对象(实例化),语法:

python

运行

对象名 = 类名()

2.3 完整基础示例

python

运行

# 定义一个Car类
class Car:
    # 类属性:所有对象共享的属性
    category = "交通工具"
    
    # 初始化方法:创建对象时自动执行,用于初始化对象属性
    def __init__(self, brand, color, price):
        # 实例属性:每个对象独有的属性
        self.brand = brand  # 品牌
        self.color = color  # 颜色
        self.price = price  # 价格
    
    # 类的方法:对象的行为
    def start(self):
        """启动汽车"""
        print(f"{self.color}的{self.brand}启动了!")
    
    def run(self, speed):
        """行驶汽车"""
        print(f"{self.brand}以{speed}km/h的速度行驶")

# 实例化:创建具体的汽车对象
car1 = Car("特斯拉", "黑色", 300000)
car2 = Car("比亚迪", "白色", 200000)

# 访问对象属性
print(car1.brand)  # 输出:特斯拉
print(car2.price)  # 输出:200000

# 访问类属性(类和对象都能访问)
print(Car.category)  # 输出:交通工具
print(car1.category) # 输出:交通工具

# 调用对象方法
car1.start()  # 输出:黑色的特斯拉启动了!
car2.run(80)  # 输出:比亚迪以80km/h的速度行驶

2.4 关键语法解析

(1)__init__方法:构造函数
  • __init__是 Python 的构造方法,创建对象时自动调用
  • 第一个参数必须是self(代表当前对象本身),后续参数用于初始化实例属性
  • self.属性名:为当前对象绑定属性,是实例属性的定义方式
  • 注意:__init__方法不需要返回值(return)
(2)self 关键字
  • self是类方法的第一个参数,必须显式声明(Python 语法规定)
  • self指向当前实例对象本身,通过self可以访问对象的属性和方法
  • 调用方法时,不需要手动传递self参数,解释器会自动传入
(3)类属性 vs 实例属性

表格

类型定义位置访问方式特点
类属性类内部、所有方法外部类名。属性 / 对象名。属性所有对象共享,修改后全局生效
实例属性__init__方法内(self.)对象名。属性每个对象独有,互不影响

示例对比

python

运行

class Person:
    # 类属性
    species = "人类"
    
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.age = age

# 修改类属性
Person.species = "智人"
p1 = Person("张三", 20)
p2 = Person("李四", 25)
print(p1.species)  # 输出:智人(所有对象都受影响)

# 修改实例属性
p1.age = 21
print(p1.age)  # 输出:21
print(p2.age)  # 输出:25(不受影响)

三、类的常用操作

3.1 访问 / 修改属性

python

运行

# 访问属性
print(car1.brand)

# 修改属性
car1.price = 290000  # 直接赋值修改
print(car1.price)  # 输出:290000

3.2 动态添加属性 / 方法

Python 支持动态给对象添加属性和方法(灵活性体现):

python

运行

# 动态添加实例属性
car1.mileage = 1000  # 新增“里程”属性
print(car1.mileage)  # 输出:1000

# 动态添加方法
def stop(self):
    print(f"{self.brand}停止了")

# 给对象绑定方法
import types
car1.stop = types.MethodType(stop, car1)
car1.stop()  # 输出:特斯拉停止了

3.3 内置属性与方法

表格

内置属性 / 方法作用示例
class获取对象所属的类print(car1.class)
dict获取对象的属性字典print(car1.dict)
doc获取类的文档注释print(Car.doc)

四、实战案例:学生信息管理

下面通过一个完整的实战案例,综合运用类与对象的知识点:

python

运行

class Student:
    """学生类:管理学生信息"""
    # 类属性:统计学生总数
    total_students = 0
    
    def __init__(self, name, age, score):
        # 实例属性
        self.name = name
        self.age = age
        self.score = score
        # 每创建一个对象,总数+1
        Student.total_students += 1
    
    def show_info(self):
        """展示学生信息"""
        print(f"姓名:{self.name},年龄:{self.age},成绩:{self.score}")
    
    def update_score(self, new_score):
        """更新成绩"""
        if 0 <= new_score <= 100:
            self.score = new_score
            print(f"{self.name}的成绩已更新为:{new_score}")
        else:
            print("成绩必须在0-100之间!")

# 创建学生对象
s1 = Student("小明", 18, 90)
s2 = Student("小红", 17, 85)
s3 = Student("小刚", 18, 78)

# 展示学生信息
s1.show_info()  # 姓名:小明,年龄:18,成绩:90
s2.update_score(95)  # 小红的成绩已更新为:95

# 查看学生总数
print(f"学生总数:{Student.total_students}")  # 输出:3

# 批量展示所有学生信息
students = [s1, s2, s3]
for stu in students:
    stu.show_info()

五、常见误区与注意事项

  1. 忘记 self 参数:类方法的第一个参数必须是 self,否则调用时会报错
  2. 混淆类属性和实例属性:修改类属性要用类名.属性,而非对象名.属性(后者会创建新的实例属性)
  3. __init__方法返回值:构造方法不能有 return 语句(除了 return None)
  4. 属性命名冲突:避免实例属性与类属性同名,否则实例属性会覆盖类属性
  5. 动态添加方法的坑:直接赋值的方法不会自动传入 self,需用types.MethodType绑定

总结

  1. 类是抽象模板,定义事物的属性和行为;对象是类的具体实例,拥有类的所有特征。
  2. __init__是构造方法,用于初始化对象属性;self代表当前对象,是访问实例属性 / 方法的核心。
  3. 类属性为所有对象共享,实例属性为每个对象独有,二者需根据场景合理使用。

掌握类与对象是 Python 进阶的关键,后续的继承、封装、多态等面向对象核心特性,都建立在本文的基础之上。建议结合实战案例多写多练,真正理解面向对象的编程思想。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐