相关疑难解决方法(0)

为什么`getattr`不支持连续的属性检索?

class A(): pass

a = A()
b = A()

a.b = b
b.c = 1

a.b     # this is b
getattr(a, "b") # so is this

a.b.c   # this is 1   
getattr(a, "b.c") # this raises an AttributeError
Run Code Online (Sandbox Code Playgroud)

假设后者,我似乎很自然.我确信这是有充分理由的.它是什么?

python

36
推荐指数
5
解决办法
9683
查看次数

嵌套对象上的getattr和setattr?

这可能是一个简单的问题,所以希望有人能够轻易指出我的错误或者这是否可能.

我有一个具有多个对象作为属性的对象.我希望能够动态设置这些对象的属性,如下所示:

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__
Run Code Online (Sandbox Code Playgroud)

输出是:

{'pet':< main .Pet对象位于0x10c5ec050>,'住所':< main .Residence对象位于0x10c5ec0d0>,'pet.name':'Sparky','residence.type':'公寓'}

如您所见,不是在人的宠物对象上设置name属性,而是创建一个新属性"pet.name".

我无法将person.pet指定为setattr,因为不同的子对象将通过相同的方法设置,即解析某些文本并在找到相关键时填写对象属性.

有没有简单/内置的方法来实现这一目标?

或者我可能需要编写一个递归函数来解析字符串并多次调用getattr,直到找到必要的子对象,然后在找到的对象上调用setattr?

谢谢!

python recursion attributes setattr python-2.7

27
推荐指数
4
解决办法
1万
查看次数

标签 统计

python ×2

attributes ×1

python-2.7 ×1

recursion ×1

setattr ×1