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

Python如何将类的单下划线私有属性转为无下划线键名的字典

实现方案

首先需要先纠正一个小细节:你示例中_var和_awesome是定义在__init__方法里的实例属性,直接调用vars(AwesomeClass)拿不到这两个属性,需要先实例化类,传入实例对象给vars()才能拿到对应的属性字典。

要去掉键名开头的单下划线前缀,最简便的方式是用字典推导式做一次转换即可,不需要修改原类的代码。


方法1:一行字典推导式(推荐日常使用)

通过startswith判断键名是否以单下划线开头,是的话就裁掉第一个字符,非下划线开头的键保持原样:

# 先实例化类
instance = AwesomeClass()
# 转换属性字典
result = {
    key[1:] if key.startswith("_") else key: value
    for key, value in vars(instance).items()
}
print(result)
# 输出: {'var': 1, 'awesome': 'awesome'}

边界提示:如果你的属性里存在单独命名为_的键,上述写法会得到空字符串键,需要规避的话可以加个长度判断:key[1:] if key.startswith("_") and len(key) > 1 else key


方法2:封装通用处理函数

如果需要在多处重复使用这个逻辑,可以封装成工具函数,还可以自定义过滤规则,比如跳过双下划线开头的私有属性、内置dunder方法:

def format_attr_dict(obj, strip_single_underline=True):
    attr_dict = {}
    for key, value in vars(obj).items():
        new_key = key
        if strip_single_underline:
            # 只处理单下划线开头的属性,双下划线开头的名称修饰属性、内置方法不处理
            if key.startswith("_") and not key.startswith("__"):
                new_key = key[1:]
        attr_dict[new_key] = value
    return attr_dict

# 调用示例
instance = AwesomeClass()
print(format_attr_dict(instance))
# 输出: {'var': 1, 'awesome': 'awesome'}

补充说明

Python中单下划线开头的属性只是社区约定的「内部使用」标识,解释器不会对这类属性做任何特殊的名称修饰,本质就是普通的实例/类属性,直接做键名裁剪的处理方式完全可以满足需求,没有额外的副作用。如果不想侵入原类的属性设计,在外层做字典转换是最灵活的方案。

内容的提问来源于stack exchange,提问作者João Mazagão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:06:31