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

时间:2013-01-24 14:00:42

标签: 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

我查看了类似的问题,其中人们使用了dictionariesgetattr,但无法使用这两种方法。

3 个答案:

答案 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')

两个函数(abcabc2)几乎完全相同。 abc会返回列表[f.a, f.b, f.c],而abc2会更快地返回元组,以下是我的结果 - 前两行显示abcabc2的输出第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]