Python:获取对象多个属性的简洁语法实现方案
这个问题我太懂了——重复敲对象名确实烦得很!刚好Python有几种简洁的写法能完美解决你的痛点,分两种场景给你拆解:
场景1:你的myObj是字典(或实现了__getitem__的类)
先把要提取的属性名(键)整理成一个元组,然后只需要写一次myObj就能生成目标元组:
# 先定义要提取的键集合 target_keys = ('one', 'five', 'six', 'seven', 'nine', 'ten', 'eleven', 'fifteen', 'twenty') # 用生成器表达式生成元组,只写一次myObj myTuple = tuple(myObj[key] for key in target_keys)
如果担心某些键可能不存在,想用默认值替代,可以换成myObj.get配合map:
# 不存在的键会返回None,也可以指定默认值比如myObj.get(key, default_val) myTuple = tuple(map(myObj.get, target_keys))
场景2:你的myObj是自定义类实例(用.访问属性,比如myObj.one)
这种情况用operator.attrgetter会更优雅,直接一次性批量提取属性并返回元组:
from operator import attrgetter # 传入所有要提取的属性名,生成一个 getter 函数 get_target_attrs = attrgetter('one', 'five', 'six', 'seven', 'nine', 'ten', 'eleven', 'fifteen', 'twenty') # 只需要调用一次getter,传入对象即可得到元组 myTuple = get_target_attrs(myObj)
进阶:模拟你期望的myObj[('key1', 'key2')]语法
如果你特别想要这种直观的写法,可以给自定义类添加__getitem__方法,让它支持接收元组作为索引:
class CustomObj: def __init__(self): self.one = 1 self.five = 5 self.six = 6 # ... 其他属性 def __getitem__(self, keys): # 如果传入的是元组,就批量提取属性返回元组 if isinstance(keys, tuple): return tuple(getattr(self, key) for key in keys) # 单个属性的情况正常返回 return getattr(self, keys) # 现在就能用你想要的写法了! myObj = CustomObj() myTuple = myObj[('one', 'five', 'six')]
不过如果是原生字典的话,没法修改它的__getitem__逻辑,所以前面两种方法会更实用。
内容的提问来源于stack exchange,提问作者GnxR
相关产品推荐
相关产品推荐

