使用变量作为变量名称的一部分

Blo*_*nce 0 python

我有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,但不能得到任何的这些方法来进行这方面的工作.

mgi*_*son 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"
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)