1. 从“狗”说起:为什么计算机需要“类”和“对象”
我先问你一个问题:如果不用类和对象,你怎么在代码里描述一只狗?
你可能想,这还不简单,定义几个变量不就行了:
python复制dog_name = "旺财"
dog_age = 3
dog_color = "棕色"
dog_breed = "中华田园犬"
没问题,你确实“描述”了一只狗。但是如果你的程序里有十只狗呢?难道要写十遍这个变量组合?如果张三、李四、王五的程序都要狗的“名、年龄、颜色、品种”,难道每个人都重新写一遍?
更麻烦的是,假设你的程序里有一百只狗,每只都要执行“叫”这个动作——难道你要写一百个函数,分别叫 dog1_bark()、dog2_bark()、dog3_bark()?这不叫编程,这叫折磨自己。
类和对象存在的根本原因就是:代码里出现了大量“结构相同、数据不同”的东西。你需要一个统一的“模板”来定义这类东西长什么样、会做什么事,然后用这个模板批量制造出每一个具体的个体。
这个“模板”就是类,也就是标题里的 Class;每一个“具体的个体”就是对象。
拿生活类比一下:类是饼干模具,对象是用这个模具压出来的一块块饼干。同一个模具可以做出无穷无尽的饼干,它们形状规则一致,但每一块上面可能撒了不同的芝麻、烤的程度也略有差异。模具本身吃不了,但饼干能吃;同样,类本身不存储具体数据,对象才存储具体数据,类只负责规定“数据长什么样、方法怎么实现”。
再换一个角度,你可以把类理解成房产开发商手里的户型图,对象就是用这个户型图盖出来的每一套房。户型图规定了“这个户型有几个卧室、几个卫生间、门在哪、窗在哪”,但它不是房子;每一套房子才是对象,同一张户型图可以盖出一模一样但位于不同楼层、不同朝向的很多套房。
这两种类比帮我在过去带过的每一批新手学生脑子里刻下了两个核心结论:
- 类是抽象的规定,对象是具体的实例。
- 类是一次定义,到处创建;对象是真正参与程序运行的数据实体。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 手写第一个类:属性、方法和构造函数的完整拆解
2.1 从“模具”到“饼干”的最小代码
不管你是学 Python、Java、C++ 还是 JavaScript,类的基本骨架几乎长得差不多。我下面用 Python 写一个最简版本,因为它语法最接近人话,适合先把概念串通:
python复制class Dog:
# 构造函数:创建对象时自动调用,负责初始化具体数据
def __init__(self, name, age, color):
self.name = name
self.age = age
self.color = color
self.energy = 100
# 普通方法:描述狗会做什么事
def bark(self):
print(f"{self.name} 汪汪汪!")
def run(self, distance):
self.energy -= distance * 0.1
if self.energy < 0:
self.energy = 0
print(f"{self.name} 跑了 {distance} 公里,剩余精力 {self.energy}")
创建对象只需要一行:
python复制wangcai = Dog("旺财", 3, "棕色")
wangcai.bark()
wangcai.run(5)
运行结果:
code复制旺财 汪汪汪!
旺财 跑了 5 公里,剩余精力 50
这一步,你实际上已经完成了类与对象的全部核心操作:定义类 → 调用构造函数创建对象 → 通过对象调方法。后面所有的概念,什么继承、封装、多态,都是在这个骨架上加料。
2.2 属性:对象身上挂着的数据
我们把上面代码里的 name、age、color、energy 称为属性。属性可以理解为对象的“状态”或“特征”,它回答的是“这个对象现在是什么样”的问题。
属性分两种:
- 实例属性:上面代码里用
self.xxx给每个对象单独绑定的数据。每只狗的name不一样,互不干扰。 - 类属性:定义在类内部、方法外部的变量,所有对象共享同一份。比如你想统计整个狗类一共创建了多少只狗对象:
python复制class Dog:
total_count = 0 # 类属性,所有实例共享
def __init__(self, name, age):
self.name = name # 实例属性,每个对象独立
self.age = age
Dog.total_count += 1
区别在哪里?Dog.total_count 只要修改一次,所有对象读到的值都变了;而 self.name 改只影响当前对象。这个区分在实战中特别容易踩坑,我在第 4 部分会专门讲一个“类属性被误当实例属性”的经典 Bug。
2.3 方法:对象会做的动作
方法就是定义在类里的函数,它描述对象“能做什么”。bark()、run() 都是方法。
这里有个新手最容易困惑的点:为什么 Python 里每个方法第一个参数都是 self?
self 在 Python
