一、一句话结论属性名示例本质能否自定义xxname,age普通属性开发者自由定义✅ 随意定义__xx____init__,__str__魔法方法 / 特殊属性Python 语言内置协议⚠️ 只能实现已有协议不能乱发明核心区别xx是写给业务用的__xx__是写给 Python 解释器用的二、xx—— 普通属性Normal Attributes1️⃣ 是什么classUser:def__init__(self,name):self.namename# 普通属性self.age18# 普通属性完全由开发者控制没有任何特殊含义不影响 Python 的对象行为2️⃣ 能做什么userUser(Alice)user.name# 读user.nameBob# 写user.emailab.com# 动态新增✅用途存数据、状态、配置三、__xx__—— 魔法方法 / 特殊属性Magic Methods1️⃣ 是什么classUser:def__init__(self,name):self.namenamedef__str__(self):returnfUser({self.name})def__len__(self):returnlen(self.name)这些是Python 数据模型的官方接口也叫dunder methodsdouble underscore。2️⃣ 为什么叫“魔法”因为它们会被Python 解释器自动调用userUser(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.namenamedef__str__(self):returnf{self.name}def__repr__(self):returnfUser(name{self.name!r})uUser(Alice)print(u)# Aliceprint(repr(u))# User(nameAlice)✅黄金法则__repr__应该是无歧义的__str__应该是可读的 运算符重载方法对应操作__add____sub__-__eq____lt____gt__classMoney:def__init__(self,amount):self.amountamountdef__add__(self,other):returnMoney(self.amountother.amount)def__eq__(self,other):returnself.amountother.amount m1Money(10)m2Money(20)m3m1m2print(m3.amount)# 30 容器行为方法对应操作__len__len(obj)__getitem__obj[i]__setitem__obj[i] x__iter__for x in objclassMyList:def__init__(self,items):self.itemsitemsdef__len__(self):returnlen(self.items)def__getitem__(self,index):returnself.items[index]mlMyList([1,2,3])print(len(ml))# 3print(ml[1])# 2 可调用对象classAdder:def__call__(self,a,b):returnab addAdder()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:normal1__mangled2# 变成 _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 说了算。