Python面向对象编程第1课:类就是图纸,实例就是房子,学不会别往下看

1 阅读6分钟

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),每个单词首字母大写,不加下划线。比如 StudentUniversityStudent
  • 实例名/函数/方法:用 小写下划线式。全小写,单词之间用下划线分隔。比如 bart_simpsonget_student_grade

3. 增加类型提示(Type Hints)。虽然Python不强制检查,但它能让代码更具可读性,方便IDE(如 PyCharm、VS Code)给你提供强力的自动补全和报错提醒。


八、一张表看懂:类 vs. 实例

概念生活比喻编程角色特点
类 (Class)汽车设计图纸抽象的模板定义属性和方法
实例 (Instance)楼下那辆具体的红色特斯拉具体的对象有独立属性,共享类方法

主心骨是,它是定义一切的蓝图;干活的是实例,它是蓝图的具体产物,里面存的才是个性化的数据。


最后总结

类和实例,就是基础中的基础。今天的内容其实就几件事:

  • class 定义类。
  • 类名() 创建实例。
  • __init__ 构造函数绑定专属属性。
  • 实例的属性是互不影响的
  • 但所有实例都共用类里定义的方法。
  • Python是动态语言,允许给单个实例随意添加属性,但别滥用。

如果能彻底理解这些,那么恭喜你,你已经成功推开了面向对象编程的大门。

评论区聊聊:你还见过哪些生活中特别适合用“类和实例”来比喻的例子?我当时最早的理解来源,就是“类就是生产手机的模具,实例就是用模具造出来的手机”。


💡 Python 学习不走弯路!

体系化实战路线:基础语法 · 异步Web开发 · 数据采集 · 计算机视觉 · NLP · 大模型RAG实战 —— 全在「道满PythonAI」