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

