Python中类与对象的基本概念与用法
·
【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 类名:
# 类的属性(变量)
# 类的方法(函数)
命名规范:
- 类名采用大驼峰命名法(每个单词首字母大写,无下划线),如
Car、Person - 避免使用 Python 内置关键字(如
int、str)作为类名
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()
五、常见误区与注意事项
- 忘记 self 参数:类方法的第一个参数必须是 self,否则调用时会报错
- 混淆类属性和实例属性:修改类属性要用
类名.属性,而非对象名.属性(后者会创建新的实例属性) - __init__方法返回值:构造方法不能有 return 语句(除了 return None)
- 属性命名冲突:避免实例属性与类属性同名,否则实例属性会覆盖类属性
- 动态添加方法的坑:直接赋值的方法不会自动传入 self,需用
types.MethodType绑定
总结
- 类是抽象模板,定义事物的属性和行为;对象是类的具体实例,拥有类的所有特征。
__init__是构造方法,用于初始化对象属性;self代表当前对象,是访问实例属性 / 方法的核心。- 类属性为所有对象共享,实例属性为每个对象独有,二者需根据场景合理使用。
掌握类与对象是 Python 进阶的关键,后续的继承、封装、多态等面向对象核心特性,都建立在本文的基础之上。建议结合实战案例多写多练,真正理解面向对象的编程思想。
更多推荐


所有评论(0)