
下划线的作用
Python 用下划线表达"访问级别",但都是约定,不是强制(Python 没有 private 那种编译期强制的封装):
| 写法 | 含义 | 类比 |
|---|---|---|
_x(单个前导) | “别碰我"——约定为私有,但还是能访问 | 贴了"内部文件"标签的柜子,锁没锁 |
__x(双前导) | “我真的不想让你碰"——名称改写(name mangling),外部访问会被改名 | 上了锁的柜子,钥匙藏在你看不到的地方 |
__x__(双前导+双结尾) | 魔术方法/特殊属性(dunder) | 系统的"官方接口”,比如 __init__、__str__ |
x_(单结尾) | 避免和关键字冲突,比如 class_ | 命名时的权宜之计 |
init 是 x 这一类——双下划线包起来 = Python 官方预留的特殊方法名。init 就是"构造方法”,str 就是"Java 的 toString()":
if name == “main” 是什么
name 是一个内置变量,Python 会给每个文件自动设置,值有两种可能:
- 这个文件被直接运行,"main"
- 这个文件被别人 import,“baseloop”(模块名)
常用魔法方法清单
1.对象生命周期
| 魔法方法 | 作用 | Java 类比 |
|---|---|---|
__init__(self, ...) | 创建对象时初始化 | 构造函数 |
__new__(cls, ...) | 真正分配内存(先于 __init__) | new 关键字底层 |
__del__(self) | 对象被回收前 | 析构函数(几乎不写) |
- 字符串类
| 魔法方法 | 作用 | Java 类比 |
|---|---|---|
__str__ | print / str() 调用 | toString() |
__repr__ | repr() / 调试输出调用 | Object.toString() 的严格版 |
- 比较运算(核心!)
| 魔法方法 | 运算符 | Java 类比 |
|---|---|---|
__eq__(self, other) | == | equals() |
__lt__ / __gt__ / __le__ / __ge__ | < > <= >= | compareTo() 相关 |
__hash__(self) | hash(obj) | hashCode() |
注意:Python 的 == 默认比较"是不是同一个对象"(内存地址),跟 Java 的 == 一样。要比较"内容相同"必须重写 eq——就是 Java 里重写 equals()。
4.算数类
| 魔法方法 | 运算符 | 例子 |
|---|---|---|
__add__ | + | 让 向量 + 向量 |
__sub__ | - | 同上 |
__mul__ | * | 让 向量 * 标量 |
- 让对象函数
| 魔法方法 | 作用 | 调用方式 |
|---|---|---|
__call__ | 实例可调用 | obj(参数) |
- 上下文管理(with函数)
| 魔法方法 | 作用 | 调用方式 |
|---|---|---|
__enter__ | 进入 with 时 | with obj as x: |
__exit__ | 退出 with 时(自动清理) | 同上 |