当前位置: 首页 > news >正文

xx 和 __xx__ 的核心区别

一、一句话结论

属性名示例本质能否自定义
xxname,age普通属性,开发者自由定义✅ 随意定义
__xx____init__,__str__魔法方法 / 特殊属性,Python 语言内置协议⚠️ 只能实现已有协议,不能乱发明

核心区别
👉xx写给业务用的
👉__xx__写给 Python 解释器用的


二、xx—— 普通属性(Normal Attributes)

1️⃣ 是什么

classUser:def__init__(self,name):self.name=name# 普通属性self.age=18# 普通属性
  • 完全由开发者控制
  • 没有任何特殊含义
  • 不影响 Python 的对象行为

2️⃣ 能做什么

user=User("Alice")user.name# 读user.name="Bob"# 写user.email="a@b.com"# 动态新增

用途:存数据、状态、配置


三、__xx__—— 魔法方法 / 特殊属性(Magic Methods)

1️⃣ 是什么

classUser:def__init__(self,name):self.name=namedef__str__(self):returnf"User({self.name})"def__len__(self):returnlen(self.name)

这些是Python 数据模型的官方接口,也叫dunder methods(double underscore)

2️⃣ 为什么叫“魔法”

因为它们会被Python 解释器自动调用

user=User("Alice")print(user)# 自动调用 user.__str__()len(user)# 自动调用 user.__len__()

没有显式调用,但它们被执行了。


四、最常见的__xx__分类速查

🔧 对象生命周期

方法触发时机
__init__对象初始化
__new__对象创建(更底层)
__del__对象销毁
classDemo:def__init__(self):print("对象创建了")def__del__(self):print("对象销毁了")

🖨️ 字符串表示

方法区别
__str__str(obj)print(obj),面向用户
__repr__repr(obj)、交互式终端,面向开发者
classUser:def__init__(self,name):self.name=namedef__str__(self):returnf"👤{self.name}"def__repr__(self):returnf"User(name={self.name!r})"u=User("Alice")print(u)# 👤 Aliceprint(repr(u))# User(name='Alice')

黄金法则__repr__应该是无歧义的__str__应该是可读的


🧮 运算符重载

方法对应操作
__add__+
__sub__-
__eq__==
__lt__<
__gt__>
classMoney:def__init__(self,amount):self.amount=amountdef__add__(self,other):returnMoney(self.amount+other.amount)def__eq__(self,other):returnself.amount==other.amount m1=Money(10)m2=Money(20)m3=m1+m2print(m3.amount)# 30

📦 容器行为

方法对应操作
__len__len(obj)
__getitem__obj[i]
__setitem__obj[i] = x
__iter__for x in obj
classMyList:def__init__(self,items):self.items=itemsdef__len__(self):returnlen(self.items)def__getitem__(self,index):returnself.items[index]ml=MyList([1,2,3])print(len(ml))# 3print(ml[1])# 2

🎯 可调用对象

classAdder:def__call__(self,a,b):returna+b add=Adder()print(add(1,2))# 3 ← 对象像函数一样被调用

五、⚠️ 最重要的一条规则

__xx__只能实现 Python 已有的协议,不要自己发明

❌ 错误示范:

classUser:def__my_custom__method__(self):# ❌ 这是灾难pass

✅ 正确做法:

classUser:defmy_custom_method(self):# ✅ 普通方法pass

原因

  • Python 未来版本可能会占用这个名字
  • 破坏代码的可读性和一致性
  • 其他开发者会困惑

六、和__xx(双下划线无后缀)的区别

命名示例用途
xxname普通属性
__xx__password名称修饰(Name Mangling)
__xx____init__魔法方法(语言协议)
classDemo:normal=1__mangled=2# 变成 _Demo__mangleddef__init__(self):pass# 魔法方法def__len__(self):return0# 魔法方法

七、内置特殊属性一览

obj.__class__# 对象的类obj.__dict__# 实例属性字典obj.__module__# 所在模块cls.__bases__# 父类元组cls.__mro__# 方法解析顺序func.__name__# 函数名func.__doc__# 文档字符串

八、实战判断口诀

🔍看到__xx__就问自己:

  • 这是 Python 官方定义的吗?
  • 它会在什么场景下被自动调用?
  • 我是不是在实现一个协议?

🔍看到xx就问自己:

  • 这是业务数据吗?
  • 需不需要控制访问?(→ property)
  • 是不是内部实现?(→_xx

九、总结对照表

特性xx__xx__
定义权开发者Python 官方
是否魔法❌ 否✅ 是
是否自动调用❌ 否✅ 是
能否乱发明✅ 可以❌ 绝对不行
典型用途业务数据协议实现

十、一句话终极总结

xx是给代码用的,__xx__是给 Python 用的。
前者你说了算,后者 Python 说了算。

http://www.cnnetsun.cn/news/3236454.html

相关文章:

  • 2026实测:宁波3大周末语文小升初机构全面评测
  • CPU虚焊诊断与维修方案对比:3种方法成本/风险/成功率全解析
  • OpenCV 4.8 相机标定实战:11张棋盘格图片获取亚像素级精度
  • CTF密码学经典题解题writeup
  • 百度网盘 YunShellExtV164.dll 注入排查:3步定位explorer/Everything高CPU元凶
  • 大模型选型避坑指南(2024企业级实测版):DeepSeek-R1 vs GPT-4 Turbo——响应速度差3.8倍?
  • “四可”政策解读:从分布式光伏到台区储能的全面覆盖
  • ERP怎么做销售管理?英雄云表单实践打造销售管理全流程
  • 多模态知识图谱来了:文本 + 图像 + 表格,图数据库如何统一建模?悦数科技
  • 为什么你的Cursor inline chat总返回无效代码?资深工程师逆向解析其token截断机制与prompt对齐黄金公式
  • 科大讯飞六麦阵列 ROS 功能包深度解析:5 步实现机器人语音交互与 360° 声源定位
  • 1980–2024 年全球干旱事件时空聚类数据集
  • 为什么你的Gemini不响应Slides?揭秘G Suite管理员策略、OAuth作用域限制与会话超时三大断连根源
  • 别再手动删C盘文件 安全清理姿势
  • 《架构特别篇二:SYSTEM 层》
  • 高斯泼溅研发哪家强?TOP5机构数据排名揭秘
  • 海外新闻稿发了等于白发?朝闻通「增强发布」戳中了多少出海品牌的传播痛点
  • 天工AI DeepResearch技术解析:智能文档生成与办公自动化实践
  • 计算机组成原理知识点+题(白中英等的版本)
  • 支付逻辑漏洞防御:5 项后端校验策略与 3 个真实代码修复案例
  • WaveTools鸣潮工具箱:3个核心功能让游戏体验提升200%的专业解决方案
  • 大数据毕设选题推荐:基于智能匹配的霍兰德职业招聘可视化系统的设计与实现 基于用户测评数据的就业趋势分析系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Next.js DApp 的 Edge Runtime 部署:Vercel Edge 与 Cloudflare Workers 的性能对比
  • 计算机毕业设计之基于SSM框架的低碳校园宿舍用电监测与激励系统设计与实现
  • Agentic Workflow时代:后端开发者需要重新思考什么?
  • 自演化数据库架构:从静态Schema到AI驱动的自适应表结构设计
  • vLLM 0.8.5 部署 Qwen2.5-7B:3个关键参数调优,吞吐量提升 40%
  • ragflow v0.26.4发布:16种语言词干化上线,Go后端持续统一,Agent与MCP一口气修复大量关键问题
  • OpenAI 最重要的一篇论文有个 bug,整个 AI 行业按错误配方烧了两年算力
  • 医学影像云PACS系统——PACS诊断工作站