在嵌套的子对象/链式属性上使用getattr和setattr?

7 浏览
0 Comments

在嵌套的子对象/链式属性上使用getattr和setattr?

我有一个对象(`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'}`。

如你所见,我并没有设置`Person`的`Pet`子对象的`name`属性,而是在`Person`上创建了一个新的属性`pet.name`。

  • 我不能将`person.pet`指定给`setattr()`,因为不同的子对象将通过相同的方法设置,该方法会解析一些文本,并在找到相关键时填充对象属性。
  • 有没有一种简单/内置的方法来实现这个?
  • 或者,也许我需要编写一个递归函数来解析字符串,并多次调用`getattr()`直到找到所需的子对象,然后在找到的子对象上调用`setattr()`?
0