当前位置: 首页 > news >正文

dir (obj) 与dir()

大白话 + 代码例子给你讲透,先给核心结论:

这两句话是在说:dir(obj)是 Python 内置的「固定规则工具」,__dir__()是类里「开发者自定义的钩子」,两者的返回结果永远做不到 100% 完全一样;而__dir__()返回什么,完全由你写的类代码决定,没有固定规则。


一、先讲第一句:「dir (obj) 永远不会和dir() 100% 完全相同」

这里的「永远不会 100% 相同」,不是指元素内容不一样,而是指返回结果的顺序、类型、细节处理,永远存在差异,核心原因是:dir(obj)是 Python 内置的上层封装函数,它有自己固定的处理逻辑,不管__dir__()返回什么,dir()都会做额外的标准化处理,导致两者结果不可能完全一致。

具体差异体现在 3 个方面:

1. 顺序永远不同

哪怕两者的元素内容完全一样,dir()也会做统一排序,而__dir__()按类内部的实现顺序返回,顺序永远不一样。

python

class 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()永远会把结果转换成标准化的列表类型,载体类型完全不同。

python

class MyClass: def __dir__(self): yield "name" # 返回生成器 yield "age" obj = MyClass() print(type(obj.__dir__())) # 输出:<class 'generator'> print(type(dir(obj))) # 输出:<class 'list'>
3. 细节处理不同

dir()会做额外的标准化处理(比如去重、过滤极端内部属性),而__dir__()返回的是原始内容,不会做任何处理。 比如你让__dir__()返回重复元素,dir()会自动去重,结果就完全不一样了:

python

class MyClass: def __dir__(self): return ["name", "age", "name"] # 重复元素 obj = MyClass() print(dir(obj)) # 输出:['age', 'name'] (自动去重) print(obj.__dir__()) # 输出:['name', 'age', 'name'] (保留原始重复)

二、再讲第二句:「dir() 的返回结果,完全由类的实现决定」

这句话的意思是:__dir__()是类里的魔法方法,你在类里怎么写这个方法,它就返回什么内容,没有任何固定的返回规则,完全由开发者自己决定。

举几个极端例子,你就懂了:

  1. 你可以让__dir__()只返回你指定的 2 个属性,不管类里有多少属性:

python

class 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']
  1. 你甚至可以让__dir__()返回和类属性完全无关的内容:

python

class MyClass: def __dir__(self): return ["我是自定义的", "完全不管类里有什么"] obj = MyClass() print(obj.__dir__()) # 输出:['我是自定义的', '完全不管类里有什么']
  1. 你可以让__dir__()返回任何类型的可迭代对象:

python

class MyClass: def __dir__(self): return ("name", "age") # 返回元组 obj = MyClass() print(obj.__dir__()) # 输出:('name', 'age')

三、最终总结

  1. dir(obj)是「固定规则的工具」,不管你__dir__()返回什么,它都会按自己的逻辑做排序、类型转换、去重等处理,所以永远不会和__dir__()的原始结果 100% 完全相同
  2. __dir__()是「开发者自定义的钩子」,返回什么内容、什么类型、什么顺序,完全由你在类里的代码实现决定,没有固定规则。
http://www.jsqmd.com/news/1244517/

相关文章:

  • 找镇海金属折弯制造厂 本地一站式精密钣金加工更放心 - 热点品牌推荐
  • 2026年7月最新雅典沈阳沈北万达广场维修保养服务电话 - 亨得利钟表维修中心
  • 2026年7月最新欧米茄北京贵友大厦(建国门店)维修保养服务电话 - 欧米茄服务中心
  • 2026实木香杉板品牌推荐 红棉花相关情况全面介绍 - 起跑123
  • 2026广州服装店主了解同城引流培训机构的日常感受 - 起跑123
  • 化工厂氢气供应厂家怎么选择 掌握实用方法避免供应风险 - 热点品牌推荐
  • 水处理冷凝器胶球清洗装置公司怎么做好全方面运营服务 - 热点品牌推荐
  • 欧米茄中国售后服务中心|最新电话与网点地址权威信息公告(2026年7月更新) - 欧米茄服务中心
  • 2026太阳能路灯厂家靠谱**,口碑**深度解析 - 官方资讯
  • 2026年分切机复卷机厂家哪家靠谱 实用选购参考指南 - 热点品牌推荐
  • 2026打算挑选宁波洁净室公司可查看的实用参考内容 - 奔跑123
  • 《解压Zip文件》二、启动一个Worker指南
  • 深度剖析:Web安全三大核心漏洞体系学习逻辑(注入、越权、文件漏洞)
  • 为什么水地源热泵厂家价格差3倍,性价比居然藏在细节里? - 官方资讯
  • Find path from root to a target node in Binary Tree
  • 2026北京知识产权律师怎么选?复合型实战专家值得关注 - 本地品牌推荐
  • 2026宁波粉尘处理设备厂家评测 博益环保综合实力梳理 - 起跑123
  • 2026年顺义酒店装修公司如何选择避坑全指南 - 热点品牌推荐
  • 2026年成都新能源代步车选购指南与优质直营店解析 - 热点品牌推荐
  • 2026年云贵川区域车间隔离靠谱服务商选购参考 - 热点品牌推荐
  • 2026年太阳能路灯厂家性价比排名,这份推荐榜请收好 - 官方资讯
  • 无锡宣传片拍摄公司实力盘点:5家机构核心能力对比 - 起跑123
  • 2026年福州少儿学民族舞口碑找哪家选靠谱机构少走弯路 - 热点品牌推荐
  • 【航路规划】战略级(飞行前)冲突解除系统,用于验证无人机在共享空域中执行预设航点任务的安全性附Matlab代码
  • 2026年顺义公共空间装修公司业内实用选择参考 - 热点品牌推荐
  • AI搜索时代的企业品牌突围:GEO优化技术解析
  • 2026年7月最新长沙全屋定制自有展厅综合实力**盘点 - 奔跑123
  • 金水区卫生间防水漏到楼下维修服务公司实用选择攻略 - 热点品牌推荐
  • 重磅:真力时温州**网点地址及客服售后热线2026年7月最新通知 - 亨得利钟表维修中心
  • 花岗岩路沿石直销工厂怎么选 实用选购全攻略助你筛选靠谱供应商 - 热点品牌推荐