讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 类属性与实例属性的查找顺序

轻枫同学_5886

轻枫同学_5886

发布时间:2026-01-26 19:23:02

|

254人浏览过

|

来源于php中文网

原创

Python属性查找的MRO路径是「实例 → 类 → 父类(按MRO顺序)」,即先查实例__dict__,再按__class__.__mro__元组从左到右依次查找类及其父类中的属性。

python 类属性与实例属性的查找顺序

Python 中属性查找的 MRO 路径是什么

Python 查找属性时,不是先看类再看实例,也不是先看实例再看类,而是严格遵循「实例 → 类 → 父类(按 MRO 顺序)」这条链。这个顺序决定了 obj.attr 最终取到的是哪个值,和你是否用 @property、是否重写了 __getattribute__ 无关——那是更底层的拦截机制,普通情况不介入。

你可以用 obj.__class__.__mro__ 看到实际的继承链,比如 class B(A): pass,那么 B().__class__.__mro__ 返回的就是 (<class>, <class>, <class>)</class></class></class>。查找就按这个元组从左到右依次尝试获取 attr。

类属性被实例属性遮蔽的典型现象

只要实例上存在同名属性(哪怕只是赋值过一次),后续对该名称的读取就永远不会再落到类属性上——不是“覆盖”,是“遮蔽”。这是最常让人困惑的点。

  • class C: x = 10,然后 c = C(),此时 c.x 是 10(来自类)
  • 执行 c.x = 20 后,c.x 变成 20(现在来自实例),而 C.x 仍是 10
  • 再执行 del c.x,c.x 又变回 10(重新命中类属性)
  • 如果类中定义了 __slots__ = ['x'],但没在实例中赋值过 x,那 c.x 仍会查类属性;一旦赋值,就进入 slots 插槽,同样遮蔽类属性

修改类属性影响所有未遮蔽的实例

类属性本质是类对象的一个普通属性,修改它只改变那个内存地址上的值。所有尚未遮蔽该属性的实例,在下次读取时都会看到新值。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

立即学习“Python免费学习笔记(深入)”;

  • class D: counter = 0,d1, d2 = D(), D(),此时 d1.counter 和 d2.counter 都是 0
  • D.counter = 100,d1.counter 和 d2.counter 立即变成 100
  • 但如果之前执行过 d1.counter = 5,那 d1.counter 就不再响应 D.counter 的变化
  • 对可变类属性(如 list、dict)直接原地修改(D.items.append(1)),即使有实例遮蔽,也不会影响已遮蔽的那些——因为它们指向不同对象

想绕过实例遮蔽直接读类属性怎么办

不能靠 obj.__class__.attr,因为如果父类也有同名属性,它不一定就是你想要的那个;正确方式是明确走 MRO 或直接访问类本身。

  • 用 type(obj).__dict__.get('attr') 只查当前类的定义(不含继承),适合确认“这个类自己有没有定义”
  • 用 getattr(type(obj), 'attr', None) 才真正模拟属性查找逻辑(含 MRO),等价于去掉实例层的查找
  • 如果知道具体类名,比如 C.x,那就最直白;但要注意这跟 obj.x 行为可能完全不同
  • 别用 obj.__dict__['attr'] 去“强制读实例”,因为实例可能根本没这个 key(比如用了 __slots__ 或属性被 @property 拦截)

真正容易出问题的不是顺序本身,而是默认以为“类属性改了,所有实例都同步”,结果发现有些实例早被遮蔽了;或者误把 obj.attr = ... 当成“设置类属性”,其实只是给实例加字段。查 MRO、看 __dict__、少用可变类属性,这三个动作比背顺序管用得多。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

4416

2024.01.03

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

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

326

2025.12.06

append用法
append用法

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

618

2023.10.25

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

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

1496

2023.11.14

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

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

2944

2025.09.12

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

20

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

20

2026.11.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn