You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中重写__dir__方法时如何正确调用内置dir函数

解决重写__dir__时调用默认实现的循环问题

我懂你碰到的这个坑——重写__dir__后,调用builtins.dir(self)反而触发了自己写的方法,陷入无限循环对吧?这是因为Python的dir()函数本身就会优先调用对象的__dir__方法,所以你在重写的版本里再调用dir(self),自然就绕回自己这儿了。

解决思路很直接:直接调用父类(通常是object)的__dir__方法,绕开你重写的版本,就能拿到默认的属性列表。

给你写个实际可用的例子:

import builtins

class MyCustomClass:
    def __init__(self):
        self.public_attr = "hello"
        self._private_attr = "secret"
    
    def __dir__(self):
        # 调用object类的默认__dir__实现,获取原始属性列表
        default_attributes = object.__dir__(self)
        # 这里可以按需修改列表,比如过滤私有属性、添加自定义项
        filtered_attributes = [attr for attr in default_attributes if not attr.startswith("_")]
        filtered_attributes.append("custom_method")
        return filtered_attributes

obj = MyCustomClass()
print(dir(obj))
# 输出会包含:['custom_method', 'public_attr', '__init__', ...](默认公共方法+自定义项)

如果你的类继承自其他内置类(比如list、dict),记得调用对应父类的__dir__,而不是object的,这样能保留父类原本的dir行为:

class MyList(list):
    def __dir__(self):
        # 调用list类的默认__dir__
        default_dir = list.__dir__(self)
        default_dir.append("my_custom_method")
        return default_dir

之前你看到的numpy类场景,因为numpy自定义类有特殊的属性管理逻辑,处理起来更复杂,但普通Python类用这种直接调用父类__dir__的方式,完全能解决你的需求。

内容的提问来源于stack exchange,提问作者Jimbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:34:59