我有一个对象( Person
),它有多个子对象( Pet, Residence
)作为属性。我希望能够像这样动态设置这些子对象的属性:
class 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 = species
class Residence(object):
def __init__(self,type='House',sqft=None):
self.type = type
self.sqft=sqft
if __name__=='__main__':
p=Person()
setattr(p,'pet.name','Sparky')
setattr(p,'residence.type','Apartment')
print p.__dict__
目前我得到错误的输出: {'pet': <__main__.Pet object at 0x10c5ec050>, 'residence': <__main__.Residence object at 0x10c5ec0d0>, 'pet.name': 'Sparky', 'residence.type': 'Apartment'}
As you can see, instead of setting the name
attribute on the Pet
subobject of the Person
, a new attribute pet.name
is created on Person
。
我无法将
person.pet
指定为setattr()
因为不同的子对象将通过相同的方法设置,如果/当找到相关键时解析一些文本并填充对象属性。有没有简单/内置的方法来完成这个?
或者我可能需要编写一个递归函数来解析字符串并多次调用
getattr()
直到找到必要的子对象,然后调用setattr()
在找到的子对象上?
原文由 TPB 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
functools.reduce
:rgetattr
andrsetattr
are drop-in replacements forgetattr
andsetattr
, which can also handle dottedattr
strings .