如何对嵌套属性使用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('.'))
posted @ 2025-07-08 16:39  思念殇千寻  阅读(8)  评论(0)    收藏  举报