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

冬瑶大大_9046

冬瑶大大_9046

2026-01-22

1007人浏览

原创

当类属性和实例属性同名时,读取优先实例属性,修改默认操作实例属性;del删除仅影响当前作用域,误用可变类属性会导致实例间共享。

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

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

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

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

  • 例如:class A: x = 10; a = A(); a.x = 20 → a.x 读取结果为 20(来自实例)
  • 而 A.x 仍是 10,不受影响
  • 新创建的实例(如 b = A())未设置 x,b.x 读取的是类属性 10

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

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

Python Pep Authoring
Python Pep Authoring

依据官方 python/peps仓库规则起草、审阅、编辑或准备 Python 改进提案(PEP),用于处理 PEP 文本和元数据头部。

下载
  • a.x = 30 并不会改变 A.x,只是更新了 a.__dict__['x']
  • 若想修改类属性本身,必须显式通过类名赋值:A.x = 30
  • 注意:修改类属性会影响所有尚未覆盖该属性的实例(即其 __dict__ 中无该键的实例)

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

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

  • del a.x 后,a.x 又变为 A.x 的值(如 10)
  • del A.x 则从类中移除该属性,之后所有未定义 x 的实例访问 x 都会触发 AttributeError
  • 不能用 del obj.attr 删除类属性——它只作用于实例字典

常见误区与建议

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

  • ❌ 错误模式:class B: data = []; def add(self, x): self.data.append(x) → 所有实例共用一个 list
  • ✅ 正确做法:在 __init__ 中为每个实例创建独立副本:self.data = []
  • ✅ 检查归属:打印 obj.__dict__ 和 type(obj).__dict__ 可直观分辨属性所在位置

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python 作用域

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

4336

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

306

9

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

2023.10.25

618

4

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

2023.11.14

1496

8

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.12

2884

8

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程