0

我有 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无法让这些方法中的任何一种为此工作。

4

3 回答 3

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和第四行显示操作需要多长时间:

[1, 2, 3]
(1, 2, 3)
0.781795024872
0.247200965881

请注意,在您的示例中,您可以使用getter = operator.attrgetter(*temp_list)

于 2013-01-24T14:01:21.500 回答
0

它应该看起来像这样:

temp_list = [] 
for property_name in needed_property_names:
    temp_list.append(getattr(object1, property_name))

所以,getattr 是你所需要的。

于 2013-01-24T14:07:54.073 回答
0

将此添加到object1作为以下实例的类中:

def getSubObjectAttributes(self):
    childAttrNames = "first second third".split()
    return [getattr(self, attrname, None) for attrname in childAttrNames]
于 2013-01-24T14:19:42.277 回答