尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

类命名空间中“同名成员的覆盖规则”和“属性查找时的递归陷阱”

类命名空间中“同名成员的覆盖规则”和“属性查找时的递归陷阱”
📅 发布时间:2026/6/22 22:53:33

class Student:score = 100  # 类属性(与方法同名)def score(self):  # 方法(与类属性同名)return self.score  # 这里的score  指的是score方法吗?是不是因为score方法把类属性score覆盖了?# 访问类属性:
print(Student.score)  # 后定义的方法覆盖了类属性,输出:<function Student.score at 0x...>
print(Student().score()) # <bound method Student.score of <__main__.Student object at 0x000002AA16B16E40>>

以上代码涉及类命名空间中“同名成员的覆盖规则”和“属性查找时的递归陷阱”,我们一步步拆解:

一、类中同名的类属性和方法:后定义的会覆盖先定义的

在类的命名空间中,后定义的成员会覆盖先定义的同名成员。
在你的代码中:

class Student:score = 100  # 1. 先定义类属性 score(值为100)def score(self):  # 2. 后定义方法 score(与类属性同名)return self.score  # 这里的 self.score 指向什么?

当类定义执行时,先将 score = 100 存入类的命名空间;随后定义 def score(self): ... 时,会用新的 score(方法对象)覆盖之前的类属性 score(100)。

因此,类 Student 的命名空间中,score 最终指向的是方法,而非最初的类属性。这就是为什么 print(Student.score) 输出的是 <function Student.score at ...>(方法对象)。

二、方法内部的 self.score 指的是什么?

方法 score(self) 中的 self.score,遵循“实例属性优先于类属性”的查找规则:

  1. 首先查找实例自身的命名空间(self.__dict__),如果实例没有 score 属性,则继续查找类的命名空间。
  2. 由于类的命名空间中,score 已经被方法覆盖(即 Student.score 是方法),因此 self.score 会指向类中的 score 方法(因为实例没有定义 score 属性)。

三、Student().score() 为什么会出问题?

当你执行 Student().score() 时,实际发生了以下过程:

  1. Student() 创建一个实例(假设为 obj),实例的命名空间中没有 score 属性。
  2. obj.score() 调用类中的 score 方法(因为 obj.score 查找到类的 score 方法)。
  3. 方法内部执行 return self.score,这里的 self.score 依然指向类的 score 方法(因为实例仍无 score 属性)。
  4. 因此,return self.score 实际返回的是方法对象本身,而 obj.score() 最终返回的是 <bound method Student.score of ...>(方法的绑定实例形式)。

更严重的是:如果方法内部写成 return self.score()(加括号调用),会导致无限递归:

def score(self):return self.score()  # 调用自身,无限递归 → 栈溢出错误

总结

  1. 类中同名的成员(类属性和方法),后定义的会覆盖先定义的,因此 Student.score 最终指向方法。
  2. 方法内部的 self.score 由于实例无此属性,会找到类中被覆盖后的 score 方法(即自身)。
  3. Student().score() 本质是调用方法,而方法返回自身(未加括号时),或因递归调用报错(加括号时)。

这种“类属性与方法同名”的写法会导致逻辑混乱和潜在错误,是 Python 中强烈不推荐的做法。实际开发中应严格避免同名,确保命名空间清晰。

相关新闻

  • mysql主从配置(保姆级) - 指南
  • 尝试从源头理解 SVD 原理和计算
  • FortiGuard实验室互联网服务安全技术解析

最新新闻

  • 从编译器到AI Agent循环:验证的三种核心属性如何被手工重建
  • 大语言模型时代,软件“买”与“建”怎么选?River 能否成可行业务待验证
  • 2026年南昌家装白皮书:十大装修公司实力排名及避坑指南 - 资讯纵览
  • i.MX23 OTP控制器详解:安全存储、启动配置与加密密钥管理
  • 2026年南京配电箱代理供应厂家top5推荐 - 信息热点
  • 长沙升学就业双保障中职学校选哪家? - 信息热点

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号