嵌套子对象链接属性上的getattr和setattr?

嵌套子对象链接属性上的getattr和setattr?,第1张

嵌套子对象/链接属性上的getattr和setattr?

您可以使用

functools.reduce

import functoolsdef 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_31174427def rgetattr(obj, attr, *args):    def _getattr(obj, attr):        return getattr(obj, attr, *args)    return functools.reduce(_getattr, [obj] + attr.split('.'))

rgetattr
并且
rsetattr
插入式替代
getattr
setattr
,这也可以处理点
attr
串。


import functoolsclass Person(object):    def __init__(self):        self.pet = Pet()        self.residence = Residence()class Pet(object):    def __init__(self,name='Fido',species='Dog'):        self.name = name        self.species = speciesclass Residence(object):    def __init__(self,type='House',sqft=None):        self.type = type        self.sqft=sqftdef rsetattr(obj, attr, val):    pre, _, post = attr.rpartition('.')    return setattr(rgetattr(obj, pre) if pre else obj, post, val)def rgetattr(obj, attr, *args):    def _getattr(obj, attr):        return getattr(obj, attr, *args)    return functools.reduce(_getattr, [obj] + attr.split('.'))

if __name__=='__main__':    p = Person()    print(rgetattr(p, 'pet.favorite.color', 'calico'))    # 'calico'    try:        # Without a default argument, `rgetattr`, like `getattr`, raises        # AttributeError when the dotted attribute is missing        print(rgetattr(p, 'pet.favorite.color'))    except AttributeError as err:        print(err)        # 'Pet' object has no attribute 'favorite'    rsetattr(p, 'pet.name', 'Sparky')    rsetattr(p, 'residence.type', 'Apartment')    print(p.__dict__)    print(p.pet.name)    # Sparky    print(p.residence.type)    # Apartment


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5649428.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存