魔术方法是什么,下划线在Python中的作用

1

下划线的作用

Python 用下划线表达"访问级别",但都是约定,不是强制(Python 没有 private 那种编译期强制的封装):

写法含义类比
_x(单个前导)别碰我"——约定为私有,但还是能访问贴了"内部文件"标签的柜子,锁没锁
__x(双前导)我真的不想让你碰"——名称改写(name mangling),外部访问会被改名上了锁的柜子,钥匙藏在你看不到的地方
__x__(双前导+双结尾)魔术方法/特殊属性(dunder)系统的"官方接口”,比如 __init____str__
x_(单结尾)避免和关键字冲突,比如 class_命名时的权宜之计

initx 这一类——双下划线包起来 = Python 官方预留的特殊方法名。init 就是"构造方法”,str 就是"Java 的 toString()":

if name == “main” 是什么

name 是一个内置变量,Python 会给每个文件自动设置,值有两种可能:

  1. 这个文件被直接运行,"main"
  2. 这个文件被别人 import,“baseloop”(模块名)

常用魔法方法清单

1.对象生命周期

魔法方法作用Java 类比
__init__(self, ...)创建对象时初始化构造函数
__new__(cls, ...)真正分配内存(先于 __init__new 关键字底层
__del__(self)对象被回收前析构函数(几乎不写)
  1. 字符串类
魔法方法作用Java 类比
__str__print / str() 调用toString()
__repr__repr() / 调试输出调用Object.toString() 的严格版
  1. 比较运算(核心!)
魔法方法运算符Java 类比
__eq__(self, other)==equals()
__lt__ / __gt__ / __le__ / __ge__< > <= >=compareTo() 相关
__hash__(self)hash(obj)hashCode()

注意:Python 的 == 默认比较"是不是同一个对象"(内存地址),跟 Java 的 == 一样。要比较"内容相同"必须重写 eq——就是 Java 里重写 equals()。

4.算数类

魔法方法运算符例子
__add__+向量 + 向量
__sub__-同上
__mul__*向量 * 标量
  1. 让对象函数
魔法方法作用调用方式
__call__实例可调用obj(参数)
  1. 上下文管理(with函数)
魔法方法作用调用方式
__enter__进入 with 时with obj as x:
__exit__退出 with 时(自动清理)同上
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计