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

如何让dir()为自定义类返回非空列表?__dir__及DirMixIn使用疑惑

解决__dir__返回空列表及DirMixIn使用问题

首先,咱们先搞清楚为什么你的__dir__会返回空列表——这几乎肯定是因为你自定义了__dir__方法,但没有正确返回应该包含的属性/方法列表。Python默认的__dir__会自动收集实例的所有属性、类属性以及继承来的方法,但如果你自己写了这个方法却只返回空列表(或者啥都不return),那自然就得到空结果了。

修复__dir__返回空的问题

如果确实需要自定义__dir__,正确的做法是先调用父类的__dir__获取默认列表,再补充你想额外暴露(或过滤掉)的内容。举个例子:

class MyCustomClass:
    # 类属性
    class_attr = "I'm a class attribute"
    
    def __init__(self):
        # 实例属性
        self.instance_attr = "I'm an instance attribute"
    
    def my_method(self):
        pass
    
    def __dir__(self):
        # 先拿到父类的默认dir结果
        default_items = super().__dir__()
        # 如果你想添加自定义的条目,或者过滤掉某些条目
        custom_items = ["my_custom_entry"]
        # 合并并去重排序(可选,但符合dir的默认行为)
        return sorted(list(set(default_items + custom_items)))

这样当你调用dir(MyCustomClass())时,就会得到包含所有默认属性方法,加上你自定义条目的列表,而不是空的了。

关于DirMixIn的使用

DirMixIn这类混入类(Mixin)的核心作用是帮你简化__dir__的实现,不用每次都手动写父类调用和属性收集逻辑。一般来说,用法就是让你的业务类继承这个混入类,它会替你处理属性的收集工作。

假设这个DirMixIn的实现是自动合并类属性、实例属性和方法,那典型用法大概是这样:

# 假设这是你提到的DirMixIn类(如果是第三方库的,逻辑类似)
class DirMixIn:
    def __dir__(self):
        # 收集类的非魔法属性/方法
        class_members = [item for item in dir(type(self)) if not item.startswith("__")]
        # 收集实例的属性
        instance_members = list(self.__dict__.keys())
        # 合并并排序,返回结果
        return sorted(class_members + instance_members)

# 你的业务类继承DirMixIn
class MyBusinessClass(DirMixIn):
    company_name = "My Corp"
    
    def process_data(self):
        pass

# 测试
obj = MyBusinessClass()
obj.user_id = 123
print(dir(obj))
# 会输出 ['company_name', 'process_data', 'user_id'] 这类内容

如果这个DirMixIn是某个库里的,可能还有一些额外配置(比如指定要排除的属性),但核心逻辑就是通过继承它,让你的类拥有现成的__dir__实现,不用自己从头写。

最后提醒一句:如果没有特殊的定制需求(比如要隐藏某些属性、添加虚拟条目),其实完全不用自定义__dir__,Python的默认实现已经能满足绝大多数场景了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:32:11