如何让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
相关产品推荐
相关产品推荐

