2016-06-29 4 views
0

Python beginner here。私は、オブジェクトのリストからクラス変数にアクセスする便利な関数を記述しようとしています。便利なクラス変数のコレクション

現在、私は変数ごとに1つの関数を書いています。たとえば、「動物」を含むクラス「群」があります。各動物には、位置、見出しなどの時系列を格納する多くの変数があります(以下の例では、ほんの一例が示されています)。

私はSwarmからすべての動物の特定の変数にアクセスする便利な方法を探していますクラス。私はn個の列を持つ行列を求めたい。ここで、nは動物の数である。

import numpy as np 

class Animal(object): 
    def __init__(self): 
     self.x=np.zeros(10) 
     self.y=np.ones(10) 

class Swarm(object): 
    def __init__(self): 
     self.animals=[] 
     self.animals.append(Animal()) 
     self.animals.append(Animal()) 

    def get_all_x(self): 
     x1=self.animals[0].x 
     x2=self.animals[1].x 
     return np.stack([x1,x2],axis=-1) 

s=Swarm() 
s.get_all_x() 

擬似コードでは、変数名を文字列入力として収集する 'Swarm'クラスの関数が必要です。

明らかに、この「var」にアクセスする方法は機能しません。何かヒント?

+1

を使うとのgetattr()](https://docs.python.org/3/library/ functions.html#getattr)。 –

答えて

2

使用getattr(obj, name) - 提供されているobjから指定されたnameのフィールドまたはメソッドを取得しようとする組み込み関数です(その属性が存在する場合)。

def get_var_from_all(self, var): 
    return np.stack([getattr(x, var) for x in self.animals],axis=-1) 

(あなたがより多くのメタプログラミングを行う上で計画している場合もhasattrsetattrに興味があるかもしれない。)

+0

素晴らしい!これは、上記の例では、xが再び変数aとbを持つオブジェクトになる場合に拡張できますか?その場合、getattr(pair、 'x.a')のようなものが欲しいですが、これはサポートされていないようです。 – jlarsch

+1

@jlarsch - おそらく、複数の 'getattr'を連鎖してその作業をする必要がありますたとえば、論理をより汎用的にしたい場合は、getattr(getattr(pair、 'x')、 'a') 'を実行するか、ループを作成してください。 – Michael0x2a

+0

私はこれを使いました:' var = ['xreturn np.stack(tmp、axis = -1) 'tmpのxのgetattr(x、var [i]); は、 – jlarsch

関連する問題