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)
假设后者,我似乎很自然.我确信这是有充分理由的.它是什么?
这可能是一个简单的问题,所以希望有人能够轻易指出我的错误或者这是否可能.
我有一个具有多个对象作为属性的对象.我希望能够动态设置这些对象的属性,如下所示:
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?
谢谢!