Python属性查找顺序为:先实例__dict__,再按MRO搜索类及其父类,描述符会改变优先级,特殊方法隐式查找遵循MRO但跳过不可调用实例属性,__getattr__是最后兜底。
Python中访问类属性时,解释器会按特定顺序搜索属性,这个顺序直接影响代码行为,尤其在继承和实例化场景下容易出错。理解查找流程是写出可维护、无歧义代码的基础。
当通过实例访问属性(如 obj.attr)时,Python首先检查该实例的 __dict__ 中是否存在该属性。如果存在,直接返回,不会继续向上查找。
法解析顺序)当实例没有该属性,或直接通过类访问(如 MyClass.attr),Python按MRO顺序在类及其父类中查找。MRO由C3线性化算法确定,可通过 ClassName.__mro__ 查看。
如果查找到的属性是一个实现了 __get__、__set__ 或 __delete__ 的描述符,Python会触发对应协议方法,而不是直接返回属性值。这是property、classmethod、staticmethod等机制的底层原理。
某些操作会隐式触发特定名称的属性查找,例如 len(obj) 查找 obj.__len__,obj + other 查找 obj.__add__。这类查找同样遵守MRO,但跳过实例字典中的同名非可调用对象。
不复杂但容易忽略。掌握这个流程,能快速定位属性未生效、意外覆盖、继承冲突等问题。