Python面向对象编程第1课:类就是图纸,实例就是房子,学不会别往下看
本文内容整理自道满PythonAI《类和实例》教程
写代码最怕啥?项目一大了,变量之间理不清关系,函数调用乱成一锅粥,维护起来想死的心都有了!
如果告诉你,有一种编程方式,能把数据和操作数据的方法打包成一个“独立王国”,一份图纸能批量生产无数“同款产品”,还不互相干扰,你敢信?
这就是 类和实例(Class & Instance)。它们是Python面向对象编程的基石。掌握了这俩,你就算真正踏入了OOP的大门。
一、到底是啥样的图纸和房子?
入门OOP,最要紧的就是先理清这两个概念。教程里有个绝佳的生活比喻:
- 类:就是一张“汽车设计图纸”。它抽象定义了所有汽车共有的属性(比如品牌、颜色)和行为(比如能启动、鸣笛)。
- 实例:就是“图纸”的产物,比如停在楼下的那辆红色特斯拉。每个实例都有自己独特的、具体的属性,但大家都能执行图纸里定义的“行为”。
官方点的说法是:类,就是抽象的「数据+行为」模板。数据叫 属性,行为叫 方法。而实例,就是根据这个模板生产出来的 具体对象。
二、5分钟教你造一张“图纸”
在Python里,造一张设计图(定义类)超级简单,就用 class 关键字。
最基础的类长这样:
class Student:
pass # 占个位,表示这个类暂时是空的
这段代码定义了一个最简单的空类。虽然它现在还啥都没干,但已经可以用来生产“空实例”了。
三、三室一厅的“房子”怎么盖?
有了设计图,马上就能盖房子(创建实例)。语法跟调用函数一样,类名 + 圆括号:
# 根据设计图造两个实例
bart = Student()
lisa = Student()
# 它们俩是独立的,占两个不同的内存地址
print(bart) # <__main__.Student object at 0x7f9a1c...>
print(lisa) # <__main__.Student object at 0x7f9a1d...>
四、给房子“精装修”:__init__ 构造函数
但光有个空房子没用啊,我们得给它装上门、刷上漆。这就要用到Python里的构造函数 __init__(前后各有两个下划线)。它会在实例创建时自动执行,作用是给实例绑定初始属性。
教程强调,在定义 __init__ 时,self 必须放在第一个参数位置。self 代表的就是“正在创建的实例本身”。
class Student:
def __init__(self, name, score):
# 把属性绑定到 self 上,就相当于给了每个实例专属的属性和数据
self.name = name
self.score = score
现在,我们再盖房子时,就必须给够图纸里要求的材料:
bart = Student('Bart Simpson', 59)
print(bart.name) # 输出:Bart Simpson
print(bart.score) # 输出:59
五、让房子“通上电”:实例方法
光有属性还不够,我们的“房子”得会开门、会关灯才行。这就要在类里定义**方法(Method)**了。
其中,最常用的是实例方法,它的第一个参数也必须是 self,用来访问当前实例的属性。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
# 定义实例方法:打印学生的成绩
def print_score(self):
print(f"{self.name} 的分数是 {self.score}")
调用方法同样很简单,Python 会自动帮你把 bart 这个实例传给 self:
bart = Student('Bart Simpson', 59)
bart.print_score() # 输出:Bart Simpson 的分数是 59
六、OOP的精髓:封装
把数据和基于该数据的方法打包成一个独立的“对象”,这就是 数据封装。这绝不是花架子,它能带来巨大好处:把属性和方法绑定在同一个类里,在逻辑上隔离了数据和外部,更安全。
比如,当你扩展一个计算成绩等级的功能时:
def get_grade(self):
if self.score >= 90: return 'A'
elif self.score >= 60: return 'B'
else: return 'C'
调用者根本不需要知道内部的分数判断逻辑,只需要一句 bart.get_grade(),就能拿到结果。外部想修改数据,也必须通过类暴露的方法。这就实现了逻辑隔离和长期维护。
七、Python特有的灵活性与“坑”
1. 动态属性:运行时“贴小广告”
Python的一个特点是允许给单个实例动态添加属性。你可以在运行时 bart.age = 8。这个属性只属于 bart,和类或 lisa 无关。
⚠️ 避坑提醒:教程明确指出,虽然这个特性很灵活,但不建议在生产环境中频繁使用,因为会让代码逻辑变得混乱,难以维护。
2. 命名规范:让你的代码一眼就很专业
整洁的代码,从良好的命名开始:
- 类名:用 大驼峰式(CapWords),每个单词首字母大写,不加下划线。比如
Student、UniversityStudent。 - 实例名/函数/方法:用 小写下划线式。全小写,单词之间用下划线分隔。比如
bart_simpson、get_student_grade。
3. 增加类型提示(Type Hints)。虽然Python不强制检查,但它能让代码更具可读性,方便IDE(如 PyCharm、VS Code)给你提供强力的自动补全和报错提醒。
八、一张表看懂:类 vs. 实例
| 概念 | 生活比喻 | 编程角色 | 特点 |
|---|---|---|---|
| 类 (Class) | 汽车设计图纸 | 抽象的模板 | 定义属性和方法 |
| 实例 (Instance) | 楼下那辆具体的红色特斯拉 | 具体的对象 | 有独立属性,共享类方法 |
主心骨是类,它是定义一切的蓝图;干活的是实例,它是蓝图的具体产物,里面存的才是个性化的数据。
最后总结
类和实例,就是基础中的基础。今天的内容其实就几件事:
- 用
class定义类。 - 用
类名()创建实例。 - 用
__init__构造函数绑定专属属性。 - 实例的属性是互不影响的。
- 但所有实例都共用类里定义的方法。
- Python是动态语言,允许给单个实例随意添加属性,但别滥用。
如果能彻底理解这些,那么恭喜你,你已经成功推开了面向对象编程的大门。
评论区聊聊:你还见过哪些生活中特别适合用“类和实例”来比喻的例子?我当时最早的理解来源,就是“类就是生产手机的模具,实例就是用模具造出来的手机”。
💡 Python 学习不走弯路!
体系化实战路线:基础语法 · 异步Web开发 · 数据采集 · 计算机视觉 · NLP · 大模型RAG实战 —— 全在「道满PythonAI」!