Python中如何通过值获取类成员变量名?是否需用if-elif?
通过值反向获取Python类成员变量名的实现方法
Python完全支持通过值反向获取类成员变量名的操作,不需要硬写冗长的if-elif分支,下面是两种常用的优雅实现方式:
方法一:提前构建反向映射字典
在类内部预先创建值到变量名的映射字典,查询时直接通过字典取值,效率最高:
class PacketType: HEARTBEAT = 0xF0 DEBUG = 0xFC ECHO = 0xFF # 生成值到变量名的反向映射,过滤掉下划线开头的内部属性 _VALUE_TO_NAME = {v: k for k, v in vars().items() if not k.startswith('_')} @staticmethod def get_name(value): # 找不到对应值时返回默认的"UNKNOWN" return PacketType._VALUE_TO_NAME.get(value, "UNKNOWN")
调用PacketType.get_name(0xF0)会直接返回"HEARTBEAT"。
方法二:动态遍历类属性
如果类成员变量很少,也可以每次调用时动态遍历类的属性字典来查找:
class PacketType: HEARTBEAT = 0xF0 DEBUG = 0xFC ECHO = 0xFF @staticmethod def get_name(value): for name, val in vars(PacketType).items(): # 跳过内部属性,匹配到对应值时返回变量名 if not name.startswith('_') and val == value: return name # 无匹配时返回默认值 return "UNKNOWN"
当然,硬写if-elif分支也能实现功能,但当类成员变量增多时,代码会变得臃肿且难以维护,上述两种方法更具备可扩展性。
内容的提问来源于stack exchange,提问作者unalignedmemoryaccess
相关产品推荐
相关产品推荐

