我有一个对象(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()
?
我根据ubntu的答案制作了一个简单的版本,名为magicattr,也可以通过解析和遍历ast来处理attrs、list和dict。
例如,对于这个类:
你可以这么做
它也不允许您/某人调用函数或赋值,因为它不使用eval或允许赋值/调用节点。
对于一个父母和一个孩子:
这比这个特定用例的其他答案更简单。
您可以使用^{} :
rgetattr
和rsetattr
是getattr
和setattr
的替换品, 它还可以处理点attr
字符串。相关问题 更多 >
编程相关推荐