0

0

Python 对象模型在复杂系统中的应用

冷漠man

冷漠man

发布时间:2026-02-13 22:40:53

|

747人浏览过

|

来源于php中文网

原创

__getattr__和__getattribute__易引发无限递归,因它们在属性访问底层被调用,内部直接访问self.xxx会再次触发自身;正确做法是用object.__getattribute__(self, name)或self.__dict__.get(name)绕过常规路径。

python 对象模型在复杂系统中的应用

为什么 __getattr____getattribute__ 容易引发无限递归

因为它们在属性访问链最底层被调用,一旦你在里面直接写 self.xxxobj.xxx,就会再次触发自身,当场栈溢出。

正确做法是绕过常规访问路径,用基类方法或 object.__getattribute__ 去取值:

  • __getattribute__ 里一律用 object.__getattribute__(self, name) 获取真实属性,绝不用 self.name
  • __getattr__ 是兜底方法,只在属性不存在时才调,所以它内部可以安全用 self.__dict__.get(name) 或查外部映射,但别再触发属性访问
  • 如果需要代理另一个对象的属性,用 type(other).__getattribute__(other, name),而不是 other.name

示例错误:

def __getattribute__(self, name):<br>    if name == 'cached_value':<br>        return self._compute()  # ❌ 这里又调了 __getattribute__

__slots__ 节省内存时,哪些动态行为会突然失效

__slots__ 关闭了实例的 __dict__,所有未声明的属性赋值都会报 AttributeError,连带影响依赖动态属性的常见模式。

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

典型断裂点:

zDiaLog弹出层效果
zDiaLog弹出层效果

代替window.open、window.alert、window.confirm;提供良好的用户体验; 水晶质感,设计细腻,外观漂亮; 兼容ie6/7/8、firefox2/3、Opera;弹出框在ie6下不会被select控件穿透; 无外部css文件,引用Dialog.js即可使用; 对iframe下的应用作了充分考虑,适合复杂的系统应用; Dialog显示的内容(三种):1、指向一个URL的

下载
  • 不能用 setattr(obj, 'new_attr', value) 添加未在 __slots__ 列表里的字段
  • json.dumps(obj) 会失败,因为默认序列化器靠 obj.__dict__ 取值;得手动实现 default 函数或加 __dict__ 回退逻辑
  • 调试时打印 obj.__dict__ 得到空字典,容易误判对象状态;应改用 vars(obj)(它会 fallback 到 __slots__)或显式遍历 __slots__
  • 继承时子类必须显式声明 __slots__,否则父类的 __slots__ 不生效;若子类想保留 __dict__,得在 slots 中加入 '__dict__'

元类中修改 __new____init__ 的执行时机差异

元类的 __new__ 在类对象创建前运行,负责构造类本身;而元类的 __init__ 在类对象已生成后运行,用于“装饰”这个刚造好的类。

这意味着:

  • 想拦截类定义、重写方法、注入属性——优先用元类 __new__,此时类还没诞生,你手上有原始 namebasesnamespace
  • 想对已存在的类对象做检查或打补丁(比如验证是否实现了某个接口),用元类 __init__ 更自然,这时 cls 已是完整类对象
  • 不要在元类 __init__ 里改 cls.__dict__,它是只读的;要改就动 cls 的属性,或用 setattr(cls, ...)
  • 如果同时定义了二者,__new__ 必须返回一个类对象,否则 __init__ 根本不会被调用

自定义 __eq__ 后,hash() 报错的根源和修复条件

Python 要求:如果两个对象 == 为真,它们的 hash() 必须相等。一旦你重写了 __eq__,Python 就自动把 __hash__ 设为 None,防止不一致。

要让实例可哈希,必须显式定义 __hash__,且满足:

  • 只要对象参与比较的字段不变,__hash__ 返回值就不能变(即这些字段得是不可变的)
  • __hash__ 返回整数,通常用 hash((self.a, self.b)) 元组哈希,别用 id(self) —— 那会让每个实例哈希值都不同,失去集合/字典意义
  • 如果类有可变字段(如列表),又想支持 __eq__,那就别实现 __hash__,接受它不可哈希的事实;强行实现会导致逻辑矛盾
  • 继承自 collections.abc.MutableSet 等内置抽象基类时,注意它们可能隐式要求可哈希,得提前确认

复杂点在于:很多框架(比如 SQLAlchemy 的 ORM 模型)默认禁用 __hash__,因为数据库主键可能延迟加载或变更——这时候硬加 __hash__ 反而埋雷。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

436

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

317

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1420

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

340

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2209

2025.12.29

java接口相关教程
java接口相关教程

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

36

2026.01.19

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号