类与实例:从图纸到实物
什么是类?
想象你去宜家买书架。你看到的展示样品不是你要带走的——你带走的是一个扁平的包裹,里面有木板、螺丝和一份说明书。
- 说明书就是"类"(class)——它描述了书架的结构和组装方法
- 你组装出来的书架就是"实例"(instance)——每个书架可以放不同的书
一个类可以创建无数个实例,就像一份说明书可以组装出无数个书架。
定义类
加载代码编辑器中……
| Python | JavaScript | |
|---|---|---|
| 定义类 | class Cat: | class Cat { } |
| 构造函数 | __init__(self, ...) | constructor(...) |
| 引用自身 | self | this |
| 创建实例 | Cat("咪咪", 3) | new Cat("咪咪", 3) |
| 方法定义 | def meow(self): | meow() { } |
注意三个关键区别:
- Python 的构造函数叫
__init__(双下划线包裹,人称"dunder方法"),JS 叫constructor - Python 每个方法的第一个参数必须是
self,JS 用this关键字自动可用 - JS 创建实例需要
new关键字,Python 不需要——直接像调用函数一样
实例属性 vs 类属性
加载代码编辑器中……
| Python | JavaScript | |
|---|---|---|
| 类属性 | 直接在 class 体中赋值 | static propName = value |
| 实例属性 | self.x = ... 在 __init__ 中 | this.x = ... 在 constructor 中 |
| 访问类属性 | ClassName.prop 或 self.prop | ClassName.prop |
Python 比较随意:类属性和实例属性都可以通过
self.xxx访问(实例属性优先)。JS 区分得更明确:类属性必须用static,且只能通过ClassName.prop访问。
方法就是"住在对象里的函数"
加载代码编辑器中……
注意命名风格的差异:Python 方法用 snake_case(下划线分隔),JS 用 camelCase(驼峰命名)。这不是语法要求,是社区约定——但你最好遵守,不然代码审查的同事会用眼神杀死你。
__str__ vs toString()
想让你的对象"自报家门"?
加载代码编辑器中……
| Python | JavaScript | |
|---|---|---|
| 用户友好的表示 | __str__() | toString() |
| 开发者调试用 | __repr__() | 没有对应(可自定义) |
| 自动调用时机 | print(obj) | 字符串拼接 "" + obj |
问问 AI
问 AI:"Python 的 __init__、__str__、__repr__ 这些双下划线方法统称什么?还有哪些常用的 dunder 方法?"
了解一下 __len__、__eq__、__lt__ 等——它们让你的对象可以像内置类型一样使用 len()、==、< 等操作。
🏋️AI 练习
创建一个 Student 类:
- 属性:
name(姓名)、grades(成绩列表) - 方法:
add_grade(grade)添加一门成绩 - 方法:
average()返回平均分 - 字符串表示:
"小明 (平均分: 85.0)"
用 Python 和 JS 各写一版。然后创建两个学生,添加一些成绩,输出他们的信息和平均分。
小结
| 概念 | Python | JavaScript |
|---|---|---|
| 定义类 | class Foo: | class Foo { } |
| 构造函数 | __init__(self) | constructor() |
| 引用自身 | self(显式参数) | this(隐式关键字) |
| 创建实例 | Foo() | new Foo() |
| 类属性 | 类体内直接写 | static prop = val |
| 字符串化 | __str__ / __repr__ | toString() |
| 命名风格 | snake_case | camelCase |
一句话:类是蓝图,实例是产品。Python 用 self 显式传递,JS 用 this 隐式引用。 记住这个核心区别,其他都好说。