我有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
Run Code Online (Sandbox Code Playgroud)
我看了看那里的人用类似的问题dictionaries,并getattr,但不能得到任何的这些方法来进行这方面的工作.
在我看来,如果您的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"
Run Code Online (Sandbox Code Playgroud)
或者为你的例子:
for name in temp_list:
blah = getattr(object1,name)
Run Code Online (Sandbox Code Playgroud)
作为也许是最后一点,这取决于你实际上什么做用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')
Run Code Online (Sandbox Code Playgroud)
两个函数(abc,abc2)几乎都做同样的事情. abc返回列表[f.a, f.b, f.c],而abc2返回一个元组快得多,这里是我的结果-第2行显示的输出abc,并abc2分别与第3和第4行显示的操作需要多长时间:
[1, 2, 3]
(1, 2, 3)
0.781795024872
0.247200965881
Run Code Online (Sandbox Code Playgroud)
请注意,在您的示例中,您可以使用 getter = operator.attrgetter(*temp_list)