news 2026/7/9 6:14:50

xx 和 __xx__ 的核心区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 说了算。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 6:14:20

2026实测:宁波3大周末语文小升初机构全面评测

在宁波这座基础教育竞争近乎白热化的城市里&#xff0c;镇海中学、效实中学、鄞州中学等名校的升学压力早已下沉到小学高年级。每逢周末&#xff0c;海曙、鄞州、镇海的街头总能见到匆匆赶课的家庭&#xff0c;背后折射的是家长的两个核心痛点&#xff1a;外来连锁品牌常常水土…

作者头像 李华
网站建设 2026/7/9 6:13:07

CPU虚焊诊断与维修方案对比:3种方法成本/风险/成功率全解析

CPU虚焊全场景解决方案&#xff1a;专业视角下的诊断与维修策略当你的手机开始出现无规律死机、莫名重启或间歇性黑屏时&#xff0c;背后可能隐藏着一个硬件层面的隐形杀手——CPU虚焊。这种看似微小却影响深远的焊接缺陷&#xff0c;往往让用户在维修选择上陷入两难。本文将带…

作者头像 李华
网站建设 2026/7/9 6:12:54

OpenCV 4.8 相机标定实战:11张棋盘格图片获取亚像素级精度

OpenCV 4.8 相机标定实战&#xff1a;从棋盘格采集到亚像素优化的完整指南 棋盘格图案在桌面上整齐排列&#xff0c;你举起相机从不同角度拍摄了11张照片——这看似简单的操作背后&#xff0c;隐藏着计算机视觉中最基础却至关重要的技术&#xff1a;相机标定。作为三维重建、SL…

作者头像 李华
网站建设 2026/7/9 6:11:39

CTF密码学经典题解题writeup

一、题目描述来源&#xff1a;实验吧CTF 1815【兔子你好】密文&#xff1a;7d1868c6db90f93b03e307f9522a48609题目提示&#xff1a;hintrabbit&#xff0c;无多余加密规则&#xff0c;仅单一算法加密&#xff0c;解密获取flag。二、算法原理Rabbit流密码是一种高速对称流密码&…

作者头像 李华