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

dictionaries私は人々が使用した同様の質問を見ましたgetattrが、これらの方法のどちらもこれのために機能させることができませんでした。

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

両方の関数(abcabc2)はほぼ同じことを行います。 abcリストを返しますが、タプルをはるかに高速に返します。これが私の結果です。最初の2行はそれぞれとの出力を示し、[f.a, f.b, f.c]3行目と4行目は操作にかかる時間を示しています。abc2abcabc2

[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 に答える