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

news/2025/10/31 18:15:55/文章来源:https://www.cnblogs.com/wangya216/p/19180911

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 中强烈不推荐的做法。实际开发中应严格避免同名,确保命名空间清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年旋转接头标杆厂家最新推荐:多通路旋转接头/水用旋转接头/回转旋转接头/H型旋转接头/液压旋转接头/旭康机械,定义工程机械与工业传热领域可靠性新标准

随着工业自动化程度不断深化及设备精密性要求持续提高,作为关键基础零部件的旋转接头,其性能稳定性、密封可靠性及使用寿命已成为影响整个设备系统运行效率的核心因素。2025年,旋转接头市场在工程机械、橡塑、化工、…

mysql主从配置(保姆级) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

打开浏览器

1、打开浏览器,然后在cmd中输入adb shell dumpsys activity | findstr "mResumedActivity" 命令 根据输出内容得到浏览器包名为 com.huawei.browser 2、代码上连接上手机并打开浏览器 from airtest.core.ap…

印度实时股票数据源接口对接文档-IPO新股、k线数据

概述 StockTV 提供全面的印度股票市场数据接口,覆盖印度国家证券交易所(NSE)和孟买证券交易所(BSE)所有上市公司。支持实时行情、技术分析、公司信息、IPO数据等多种功能。 基础信息基础URL: https://api.stocktv…

尝试从源头理解 SVD 原理和计算

SVD 是怎么被“想出来”的?——从一个朴素问题出发 你有没有见过这样的公式? \[M = U \Sigma V^T \]看起来挺简洁,对吧?但当你翻开教材,发现这背后藏着一堆正交矩阵、奇异值、特征向量……瞬间头大。 我每次看到 …

2025年家用电梯厂家推荐榜:美利达电梯实力登顶

随着人口老龄化加剧、别墅及老旧小区加装电梯需求增长,家用电梯市场正迎来快速发展期。2025年家用电梯市场规模预计持续扩大,但市场增长也带来厂商技术实力、产品安全性、服务质量参差不齐的问题,家庭用户在选购时往…

流程定时任务设置参数

总结几点内容:windows命令行或者放在task schedule里执行的bat(批处理文件),应该以ANSI编码的方式进行保存。 如果bat文件里不含任务中文,则可以以UTF-8的编码格式保存,但不能带BOM。windows的命令行执行批处理文件…

activemqCVE-2016-3088漏洞复现

activemq/CVE-2016-3088漏洞复现 原理 影响版本:Apache ActiveMQ 5.x~5.14.0 漏洞原理:ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;a…

FortiGuard实验室互联网服务安全技术解析

本文详细介绍了FortiGuard实验室的互联网安全服务体系,涵盖威胁检测、防护响应、安全运维等核心技术模块,包含恶意软件防护、入侵防御、云安全等具体技术方案,以及产品集成与版本更新机制。研究服务 研究研究新兴网…

神舟二十一号|2030年前实现中国人登陆月球的目标不动摇

10月30日,神舟二十一号载人飞行任务新闻发布会在酒泉卫星发射中心举行。 中国载人航天工程新闻发言人、中国载人航天工程办公室综合计划局局长张静波表示,2030年前实现中国人登陆月球的目标不动摇。目前,载人登月任…

博客园打印 - miao

F12 + (function(){use strict;$("#comment_form, #header, #leftmenu, #big_banner, #footer, #blog_post_info_block").remove();$("#content").css(margin,0);$("body").css(margin,…

简单线段树

#include <bits/stdc++.h> using namespace std; using ull = unsigned long long; using ll = long long; const int N = 50010; int T; struct node {int l, r;ll sum, add; } tr[N * 4]; ll a[N]; inline in…

vn.py 的日志问题 回测策略的日志处理

vn.py 的日志问题 回测策略的日志处理在回测时,如果不用ui, 测试策略。 范例是直接使用: engine = BacktestingEngine()engine.set_parameters(**test_setting)engine.add_strategy(strategy, strategy_setting)eng…

Python文件操作(下)_ 会写文件,程序便有了记忆

Python文件操作(下)_ 会写文件,程序便有了记忆1

Python文件操作(上)_ 会读文件,程序便有了眼睛

Python文件操作(上)_ 会读文件,程序便有了眼睛#方法一:读取文件f = open("./_math.py", "r", encoding="utf-8")content = f.readlines()for line in content: print(line)f.clo…

KeyShot许可管理监控工具使用指南

在团队或企业中,随着3D渲染需求的增长,对KeyShot许可证的有效管理变得至关重要。为了帮助您更好地掌握KeyShot许可管理的监控工具,本文将提供一份详尽的使用指南,确保您能够轻松实现许可证使用的透明化。 一、了解…

精益装配,智造未来:哲讯科技SAP解决方案赋能装配制造企业数字化转型

精益装配,智造未来:哲讯科技SAP解决方案赋能装配制造企业数字化转型在全球化竞争与个性化需求日益凸显的今天,装配制造企业正站在转型升级的十字路口。从简单的零件组装到复杂的系统集成,从大批量标准化生产到多品…

2025 年工业陶瓷源头厂家最新推荐榜:聚焦技术与服务优选,助力企业精准采购优质工业陶瓷产品工业陶瓷/工业陶瓷管公司推荐

引言 当前工业陶瓷市场需求旺盛,却面临产品质量参差不齐、核心技术缺失、供应链不稳定及环保合规难等问题,严重影响企业采购效率与生产稳定性。为帮助各行业企业精准筛选可靠的工业陶瓷源头厂家,避开采购陷阱,降低…

2025 年氧化铝陶瓷源头厂家最新推荐排行榜:聚焦六大优质企业,助力下游企业精准选合作方氧化铝陶瓷管/氧化铝陶瓷棒/氧化铝陶瓷片公司推荐

引言 当前锂电、半导体、新能源等行业对高品质氧化铝陶瓷需求激增,市场厂家数量虽多,但存在部分厂家无核心技术、非源头生产致成本高、质量管控漏洞多等问题,下游企业常因信息不对称难选靠谱合作方。为破解此困境,…

revit api视图

revit api视图获取视图类型 //Autodesk.Revit.DB.View view = GetView(); //两种判断视图类型的方法: //第一种: ViewType viewType = view.ViewType; switch (viewType) {case Autodesk.Revit.DB.ViewType.ThreeD:/…