简化从非定义类型对象创建DotDict的代码实现
代码简化与效率优化方案
方案一:保持原功能的简化写法
原代码可以通过字典推导式结合生成器表达式重构,既简化结构又避免重复调用getattr提升效率:
return DotDict({ name: value for name, value in ((n, getattr(obj, n)) for n in dir(obj)) if not name.startswith('__') and not ismethod(value) })
- 用生成器表达式一次性获取属性名和对应的值,减少
getattr的调用次数 - 直接将推导结果传入
DotDict构造函数,省去手动初始化字典并逐个赋值的步骤
方案二:针对实例属性的高效优化(按需选择)
如果你的需求仅需获取obj的实例自有属性(不需要包含类层面定义的属性),可以直接遍历obj.__dict__,性能比dir()+getattr()的组合更优:
return DotDict({ name: value for name, value in obj.__dict__.items() if not name.startswith('__') and not ismethod(value) })
obj.__dict__直接存储实例的属性键值对,无需额外通过getattr取值,执行效率更高- 注意:此方案不会包含类中定义的属性,仅适用于只需要实例自身属性的场景
内容的提问来源于stack exchange,提问作者UsayHi
相关产品推荐
相关产品推荐

