发布时间:2026/7/23 0:36:12
dir (obj) 与dir() 用大白话 代码例子给你讲透先给核心结论这两句话是在说dir(obj)是 Python 内置的「固定规则工具」__dir__()是类里「开发者自定义的钩子」两者的返回结果永远做不到 100% 完全一样而__dir__()返回什么完全由你写的类代码决定没有固定规则。一、先讲第一句「dir (obj) 永远不会和dir() 100% 完全相同」这里的「永远不会 100% 相同」不是指元素内容不一样而是指返回结果的顺序、类型、细节处理永远存在差异核心原因是dir(obj)是 Python 内置的上层封装函数它有自己固定的处理逻辑不管__dir__()返回什么dir()都会做额外的标准化处理导致两者结果不可能完全一致。具体差异体现在 3 个方面1. 顺序永远不同哪怕两者的元素内容完全一样dir()也会做统一排序而__dir__()按类内部的实现顺序返回顺序永远不一样。pythonclass MyClass: def __init__(self): self.name test self.age 18 def __dir__(self): return [name, age] # 自定义顺序 obj MyClass() print(dir(obj)) # 输出[age, name] dir做了排序 print(obj.__dir__()) # 输出[name, age] 按你写的顺序返回2. 类型可能完全不同__dir__()可以返回任何可迭代类型生成器、元组等而dir()永远会把结果转换成标准化的列表类型载体类型完全不同。pythonclass MyClass: def __dir__(self): yield name # 返回生成器 yield age obj MyClass() print(type(obj.__dir__())) # 输出class generator print(type(dir(obj))) # 输出class list3. 细节处理不同dir()会做额外的标准化处理比如去重、过滤极端内部属性而__dir__()返回的是原始内容不会做任何处理。 比如你让__dir__()返回重复元素dir()会自动去重结果就完全不一样了pythonclass MyClass: def __dir__(self): return [name, age, name] # 重复元素 obj MyClass() print(dir(obj)) # 输出[age, name] 自动去重 print(obj.__dir__()) # 输出[name, age, name] 保留原始重复二、再讲第二句「dir() 的返回结果完全由类的实现决定」这句话的意思是__dir__()是类里的魔法方法你在类里怎么写这个方法它就返回什么内容没有任何固定的返回规则完全由开发者自己决定。举几个极端例子你就懂了你可以让__dir__()只返回你指定的 2 个属性不管类里有多少属性pythonclass MyClass: def __init__(self): self.name test self.age 18 self.gender 男 # 这个属性故意不返回 def __dir__(self): return [name, age] # 只返回这两个 obj MyClass() print(obj.__dir__()) # 输出[name, age]你甚至可以让__dir__()返回和类属性完全无关的内容pythonclass MyClass: def __dir__(self): return [我是自定义的, 完全不管类里有什么] obj MyClass() print(obj.__dir__()) # 输出[我是自定义的, 完全不管类里有什么]你可以让__dir__()返回任何类型的可迭代对象pythonclass MyClass: def __dir__(self): return (name, age) # 返回元组 obj MyClass() print(obj.__dir__()) # 输出(name, age)三、最终总结dir(obj)是「固定规则的工具」不管你__dir__()返回什么它都会按自己的逻辑做排序、类型转换、去重等处理所以永远不会和__dir__()的原始结果 100% 完全相同__dir__()是「开发者自定义的钩子」返回什么内容、什么类型、什么顺序完全由你在类里的代码实现决定没有固定规则。

相关新闻

2026/7/23 0:36:11

告别AI瞎写代码!18万Star开源Skills仓库,8大核心技能干货详解

文章目录一、GitHub现在有多离谱?纯文本仓库半年干到18万收藏1.1 跟普通写CLAUDE.md提示词根本不是一个东西二、30秒一键安装,小白也能直接上手2.1 必开初始化技能,一键适配你的项目三、八大王牌技能,每一个都能解决程序员痛点3.1…

2026/7/23 0:31:11

威胁狩猎实战:如何在茫茫日志中找到那只“隐蔽的熊“

"如果你等到告警才行动,你已经慢了。"——威胁狩猎的核心,不是更快地响应告警,而是在告警产生之前,就发现攻击者的踪迹。前言传统安全防御是"被动响应"的:攻击者入侵 → 触发告警 → 安全团队响应…

2026/7/23 1:51:16

Fable 5复活遇冷:用户沉默背后的产品心理学

1. 项目背景:Fable 5的复活与用户沉默现象Fable 5作为一款曾经风靡一时的社交应用,在沉寂多年后突然宣布复活。这个曾经承载着无数用户青春记忆的平台,带着全新的界面设计和功能升级重新出现在应用商店。但令人意外的是,首批下载使…

2026/7/23 1:51:16

ICME 2026 高精度制造跨场景缺陷检测与细粒度缺陷分级挑战赛

1 概述 本文聚焦于ICME 2026高精度制造跨场景缺陷检测与细粒度缺陷分级挑战赛。当前工业缺陷检测系统主要面临两大瓶颈:一是基于深度学习的模型在部署至未见过的生产场景时,性能显著退化;二是现有公开数据集普遍缺乏标准化的缺陷严重程度评估体系,而精准分级对于生产风险预…

2026/7/23 1:51:16

Transformer可解释性新突破:位置感知LRP方法解析

1. 项目概述:重新审视LRP方法在Transformer可解释性中的应用2025年NIPS会议这篇题为《Revisiting LRP: Positional Attribution as the Missing Ingredient for Transformer Explainability》的论文,提出了一个引人深思的观点:位置归因&#…

2026/7/23 1:51:16

程序员转型AI:核心岗位、技能提升与职业发展指南

1. 程序员转行AI的现状与机遇最近两年,AI领域的人才需求呈现爆发式增长。根据行业调研数据显示,AI相关岗位的薪资水平普遍比传统开发岗位高出30%-50%。这吸引了大批程序员开始考虑向AI领域转型。但转型之路并不简单,需要系统性地了解行业现状…

2026/7/23 1:51:16

Day 011 — Spring 全家桶深度拆解

📅 2026-07-25 | 🏷️ Java 后端方向 | ⏱️ 建议 5h | 🎯 Spring 是 Java 面试的绝对核心——IOC/AOP/Boot 三位一体 📌 今日知识地图 Spring 面试全景 │ ├── 模块一:Spring IOC │ ├── BeanFactory…

2026/7/23 1:46:16

ROS快速入门:10分钟掌握核心通信与SLAM实践

1. ROS快速入门:为什么需要10分钟精简例程?ROS(Robot Operating System)作为机器人开发的事实标准平台,其学习曲线一直让初学者望而生畏。传统ROS教程往往从冗长的环境配置开始,到第一个"Hello World&…

2026/7/22 9:29:13

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/23 0:01:10

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/22 21:00:12

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…