Pyhton魔术方法与Java整理

📅 2026/7/2 7:04:06
Pyhton魔术方法与Java整理
Pyhton魔术方法与Java整理第一类对象的“生老病死”构造与析构第二类把自己伪装成“函数”第三类字符串表示调试神器第四类把自己伪装成“容器”列表/字典第五类运算符重载数学与比较第六类属性访问控制Getter/Setter第七类上下文管理器With语句总结一张表看懂 Python 的“潜规则”Python 里这些被双下划线包裹的方法官方名叫 Magic Methods魔术方法社区常叫 Dunder Methods双下方法。它们很像 Java 里的“特殊方法”但比 Java 多得多也更自由。如果把 Java 比作“规矩森严的工厂”Python 的这些魔术方法就是给对象开的“后门”让你能伪装成内置类型比如假装自己是函数、列表、字典。以下是 Python 中最核心、最常用的魔术方法分类大全我特意加了大量 Java 对比方便你理解第一类对象的“生老病死”构造与析构这是“构造函数”家族。方法类比Java 含义_name _()-区分「文件是被直接运行还是被导入」_new _(cls, …)-真正的构造函数创建对象。极少重写多用于单例模式或不可变对象。_init _(self, …)构造函数ClassName()初始化函数。对象创建后自动调用用来赋初值。_del _(self)finalize() 析构函数。对象被垃圾回收前调用不推荐依赖它因为GC时机不确定。Python 特色__new __ 和 __init __ 分离。• __new __ 负责“生孩子”分配内存返回对象。• __init __ 负责“养孩子”给对象穿衣服、起名字。• __name __ Python 解释器运行一个.py文件时会自动给这个文件对应的模块对象设置__name __属性如果直接运行这个文件比如python test.py__name __会被设为字符串__main __“。如果这个文件被其他文件import比如import testtest.py的__name __就是文件名test”。最经典的用法if __name __ “__main __”:第二类把自己伪装成“函数”方法类比Java 含义__call __(self, …)Functional Interface让实例变得可调用。定义了这个方法对象就能像函数一样加括号执行obj()第三类字符串表示调试神器Java 里靠Override toString()Python 有两个分工明确。方法类比Java 含义__str __(self)toString()给用户看。执行 print(obj) 或 str(obj) 时调用。追求可读性。__repr __(self)toString() (调试版)给开发者看。直接输入 obj 回车时调用。追求准确性最好能用来重建对象。潜规则如果只写一个就写 __repr __。第四类把自己伪装成“容器”列表/字典这是 Python 比 Java 灵活得多的一个地方。你可以让一个对象支持 obj[key]、len(obj) 这种操作。方法类比Java 含义__len __(self)size() / length()定义 len(obj) 的行为。__getitem __(self, key)get(index) / get(key)定义 obj[key] 的读取行为。__setitem __(self, key, val)put(index, val)定义 obj[key] val 的写入行为。__contains __(self, item)contains()定义 in 运算符的行为 (if x in obj)。第五类运算符重载数学与比较Java 不允许运算符重载除了 拼接字符串Python 允许。方法运算符含义__add __(self, other)加法__sub __(self, other)-减法__eq __(self, other)相等__lt __(self, other)小于__gt __(self, other)大于例子classVector:def__init__(self,x):self.xxdef__add__(self,other):returnVector(self.xother.x)v1Vector(1)v2Vector(2)v3v1v2# 这里自动调用 __add__第六类属性访问控制Getter/SetterJava 里用 getX() 和 setX()Python 用装饰器但底层是这些方法。方法类比Java 含义__getattr __(self, name)-访问不存在的属性时调用常用于动态代理。__setattr __(self, name, val)Setter设置属性时调用慎用容易死循环。__getattribute __(self, name)Getter访问任何属性时调用比getattr更底层。第七类上下文管理器With语句对应 Java 的 try-with-resources。方法类比Java 含义__enter __(self)try(…)进入 with 代码块时调用。__exit __(self, …)catch/finally退出 with 代码块时调用无论是否异常。例子withopen(file.txt)asf:dataf.read()这里自动调用了 f.__enter __() 和 f.__exit __()总结一张表看懂 Python 的“潜规则”如果你想让对象实现这个方法像函数一样被调用 __call __用 print() 打印好看 __str __用 len() 取长度 __len __用 obj[key] 取值 __getitem __用 obj1 obj2 相加 __add __用 with 管理资源 __enter __, __exit __支持 for…in… 循环 __iter __, __next __一句话总结Java 的“特殊方法”是语言规定死的Python 的魔术方法是开放的协议只要你实现了特定的双下方法你的对象就能获得对应的“超能力”。