如何在Python模块或类中限制dir()返回自定义属性?
实现限制dir()仅返回特殊属性的方案
要让特定类、对象或模块的dir()仅返回默认特殊属性(以__开头和结尾的属性/方法),可以通过重写__dir__方法实现,以下是具体方案:
1. 针对自定义类(含类本身和实例)
直接在类中定义__dir__方法,过滤掉非特殊属性:
class Person: name = "John" age = 36 country = "Norway" def __dir__(self): # 调用父类的__dir__获取完整属性列表,再过滤出特殊属性 return [attr for attr in super().__dir__() if attr.startswith('__') and attr.endswith('__')] # 测试类的dir输出 print(dir(Person)) # 仅返回__class__、__delattr__等特殊属性 # 测试实例的dir输出 p = Person() print(dir(p)) # 同样只返回特殊属性
2. 针对模块
如果需要限制某个模块的dir()输出,在模块文件中定义__dir__函数即可:
# 示例模块:restricted_module.py public_var = "visible" _internal_var = "hidden" def __dir__(): # 过滤出模块中的特殊属性 return [attr for attr in globals() if attr.startswith('__') and attr.endswith('__')]
导入该模块后,执行dir(restricted_module)只会返回__name__、__file__等特殊模块属性。
3. 批量处理多个类(Mixin复用)
如果有多个类需要限制dir(),可以编写一个Mixin类,让目标类继承它:
class DirRestrictMixin: def __dir__(self): return [attr for attr in super().__dir__() if attr.startswith('__') and attr.endswith('__')] # 继承Mixin后自动生效 class Person(DirRestrictMixin): name = "John" age = 36 country = "Norway" class Product(DirRestrictMixin): id = 1001 price = 99.9
注意事项
super().__dir__()会保留原本的属性收集逻辑,确保特殊属性不会遗漏;- 该方法仅影响
dir()的输出,不影响属性的正常访问(比如Person.name仍然可以正常获取),如果需要同时限制属性访问,还需结合__getattr__或__getattribute__方法。
内容的提问来源于stack exchange,提问作者gaamaa
相关产品推荐
相关产品推荐

