跳到主要内容

类与实例:从图纸到实物

什么是类?

想象你去宜家买书架。你看到的展示样品不是你要带走的——你带走的是一个扁平的包裹,里面有木板、螺丝和一份说明书

  • 说明书就是"类"(class)——它描述了书架的结构和组装方法
  • 组装出来的书架就是"实例"(instance)——每个书架可以放不同的书

一个类可以创建无数个实例,就像一份说明书可以组装出无数个书架。

定义类

加载代码编辑器中……
PythonJavaScript
定义类class Cat:class Cat { }
构造函数__init__(self, ...)constructor(...)
引用自身selfthis
创建实例Cat("咪咪", 3)new Cat("咪咪", 3)
方法定义def meow(self):meow() { }

注意三个关键区别:

  1. Python 的构造函数叫 __init__(双下划线包裹,人称"dunder方法"),JS 叫 constructor
  2. Python 每个方法的第一个参数必须是 self,JS 用 this 关键字自动可用
  3. JS 创建实例需要 new 关键字,Python 不需要——直接像调用函数一样

实例属性 vs 类属性

加载代码编辑器中……
PythonJavaScript
类属性直接在 class 体中赋值static propName = value
实例属性self.x = ...__init__this.x = ...constructor
访问类属性ClassName.propself.propClassName.prop

Python 比较随意:类属性和实例属性都可以通过 self.xxx 访问(实例属性优先)。JS 区分得更明确:类属性必须用 static,且只能通过 ClassName.prop 访问。

方法就是"住在对象里的函数"

加载代码编辑器中……

注意命名风格的差异:Python 方法用 snake_case(下划线分隔),JS 用 camelCase(驼峰命名)。这不是语法要求,是社区约定——但你最好遵守,不然代码审查的同事会用眼神杀死你。

__str__ vs toString()

想让你的对象"自报家门"?

加载代码编辑器中……
PythonJavaScript
用户友好的表示__str__()toString()
开发者调试用__repr__()没有对应(可自定义)
自动调用时机print(obj)字符串拼接 "" + obj
问问 AI

问 AI:"Python 的 __init____str____repr__ 这些双下划线方法统称什么?还有哪些常用的 dunder 方法?"

了解一下 __len____eq____lt__ 等——它们让你的对象可以像内置类型一样使用 len()==< 等操作。

🏋️AI 练习

创建一个 Student 类:

  1. 属性:name(姓名)、grades(成绩列表)
  2. 方法:add_grade(grade) 添加一门成绩
  3. 方法:average() 返回平均分
  4. 字符串表示:"小明 (平均分: 85.0)"

用 Python 和 JS 各写一版。然后创建两个学生,添加一些成绩,输出他们的信息和平均分。

小结

概念PythonJavaScript
定义类class Foo:class Foo { }
构造函数__init__(self)constructor()
引用自身self(显式参数)this(隐式关键字)
创建实例Foo()new Foo()
类属性类体内直接写static prop = val
字符串化__str__ / __repr__toString()
命名风格snake_casecamelCase

一句话:类是蓝图,实例是产品。Python 用 self 显式传递,JS 用 this 隐式引用。 记住这个核心区别,其他都好说。