我有object1,里面有很多子对象。这些子对象以object1.subobject
的形式访问。我有一个函数,它返回原始对象的子对象列表。我想做的就是遍历列表并访问每个子对象。像这样:
temp_list = listSubChildren(object1) #Get list of sub-objects
for sub_object in temp_list: #Iterate through list of sub-objects
blah = object1.sub-object #This is where I need help
#Do something with blah #So that I can access and use blah
我查看了类似的问题,其中人们使用了dictionaries
和getattr
,但无法使用这两种方法。
答案 0 :(得分:6)
在我看来,如果您的listSubChildren
方法正在返回字符串,则可以使用内置getattr
函数。
>>> class foo: pass
...
>>> a = foo()
>>> a.bar = 1
>>> getattr(a,'bar')
1
>>> getattr(a,'baz',"Oops, foo doesn't have an attrbute baz")
"Oops, foo doesn't have an attrbute baz"
或者你的例子:
for name in temp_list:
blah = getattr(object1,name)
也许是最后一点,取决于您使用blah
实际做什么,您可能还需要考虑operator.attrgetter
。请考虑以下脚本:
import timeit
import operator
class foo(object):
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
def abc(f):
return [getattr(f,x) for x in ('a','b','c')]
abc2 = operator.attrgetter('a','b','c')
f = foo()
print abc(f)
print abc2(f)
print timeit.timeit('abc(f)','from __main__ import abc,f')
print timeit.timeit('abc2(f)','from __main__ import abc2,f')
两个函数(abc
,abc2
)几乎完全相同。 abc
会返回列表[f.a, f.b, f.c]
,而abc2
会更快地返回元组,以下是我的结果 - 前两行显示abc
和abc2
的输出第3行和第4行分别表示操作需要多长时间:
[1, 2, 3]
(1, 2, 3)
0.781795024872
0.247200965881
请注意,在您的示例中,您可以使用getter = operator.attrgetter(*temp_list)
答案 1 :(得分:0)
看起来应该是这样的:
temp_list = []
for property_name in needed_property_names:
temp_list.append(getattr(object1, property_name))
所以,getattr就是你所需要的。
答案 2 :(得分:0)
将此添加到object1
是以下的实例的类:
def getSubObjectAttributes(self):
childAttrNames = "first second third".split()
return [getattr(self, attrname, None) for attrname in childAttrNames]