如何对嵌套属性使用setattr和getattr
参考资料:
https://segmentfault.com/q/1010000043269162 (翻译而来非原贴)
简单来说setattr和getattr只支持对对象的直接属性进行复制,如果是嵌套的多层属性就需要递归地改变每一层的attr,这个过程我理解实际上等价于直接用小数点连接的赋值,但是因为可以用字符串控制,所以更方便。
import functools def rsetattr(obj, attr, val): pre, _, post = attr.rpartition('.') return setattr(rgetattr(obj, pre) if pre else obj, post, val) # using wonder's beautiful simplification: https://stackoverflow.com/questions/31174295/getattr-and-setattr-on-nested-objects/31174427?noredirect=1#comment86638618_31174427 def rgetattr(obj, attr, *args): def _getattr(obj, attr): return getattr(obj, attr, *args) return functools.reduce(_getattr, [obj] + attr.split('.'))

浙公网安备 33010602011771号