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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:20