贝利信息

类属性和实例属性同名时读取顺序及修改行为详解

日期:2026-01-22 00:00 / 作者:冷漠man
当类属性和实例属性同名时,读取优先实例属性,修改默认操作实例属性;del删除仅影响当前作用域,误用可变类属性会导致实例间共享。

当类属性和实例属性同名时,Python 的读取和修改行为遵循明确的规则:读取时优先使用实例属性(如果存在),修改时默认操作的是实例属性(不会影响类属性),除非显式通过类名操作。

读取时:实例属性覆盖类属性

访问对象属性时,Python 先在实例的 __dict__ 中查找,命中则直接返回;未命中才去类及其父类的 __dict__ 中查找。因此,一旦实例拥有同名属性,类属性就被“遮蔽”(shadowed)。

修改时:默认创建或更新实例属性

对实例执行赋值操作(如 obj.attr = value),Python 总是将该属性写入实例的 __dict__,无论类中是否已存在同名类属性。

删除行为:只影响当前作用域

使用 del obj.attr 删除的是实例属性;删除后再次访问该属性,会自动回退到类属性(如果存在)。

常见误区与建议

容易误以为给实例赋同名属性是在“修改类属性”,或误用 self.attr = ... 初始化可变类属性(如列表、字典),导致多个实例意外共享同一对象。