python学习笔记四 (运算符重载和命名空间、类)
从以上代码中应该了解到:
obj.attribute 查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以去到值。
但通过__dict__就取不到值,因为__dict__属性是基于类对象的命名空间字典。
命名空间:
局部命名空间,全局命名空间,内建命名空间
locals() 为局部命名空间, globals()全局命名空间
# 类的扩展
一种好的扩展方式,一种坏的扩展方式,自行体会
除了类的继承外,还有一种委托模式
这里应用到了 __getattr__方法, 同时还存在一个__getattribute__方法
当x.y 时,如果y不存在,则会调用__getattr__方法, 如果同时实现了__getattr__, __getattribute__方法,则只会走getattribuet方法
如果只定义了__getattribute__方法,x.y不管y存在不存在都会走__getattribute__方法
截图中,其实__repr__方法还是需要重新定义的,因为__getattr__方法对于内置属性是不起作用的,所以当我注释掉之后,打印mange的时候不是调用Person的__repr__,而是打印了默认的__repr__方法
这里突然插入一个新的点, 新式类与经典类的区别:
1、新式类继承自object, 经典类不继承任何类
2、新式类使用super(子类,self).__init__ 完成构造函数继承, 经典类是使用 父类.__init__完成构造函数继承
3、新式类:广度优先的查询 ; 经典类:python2.* 是深度优先的查询, python3.*是广度优先的查询,深度优先的查找方式已经是被废弃了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY