2011-07-09 15 views
1

申し訳ありませんが、これが尋ねられても、これが可能かどうかを示すために何かオンラインが見つかりませんでした。マップを使用してクラス関数を呼び出す

class A: 
    def a(self,): 
     print "Hello" 
B = [A for i in xrange(10)] 
map(self.a,B) 

は基本的に私は、自己定義されたクラスの配列を反復処理し、クラスの関数を呼び出すしたい:私はこれを説明することができます最も簡単な方法は、ちょうど私のこの問題のちょうどされた代表とのコードセグメント、です。クラスの関数が自己完結型であり、何も返されない場合には、内部変数の変更を引き起こすことになります。どのような助けも本当に感謝しており、終わりに私はマルチプロセッシングでそれを使用したいと考えています。

おかげで、 アリ

+0

'a()'はインスタンスメソッドです。 '@ classmethod'デコレータが必要です。 – geoffspear

+0

クラスメソッドに固定されています。初期の返答をおかけして申し訳ありません。 –

+0

あなたはここでいくつかのコンセプトを混同しています。クラスまたはインスタンスのリストのリスト(配列ではない)?クラスは値を返さないので、そこにメソッドを意味するのでしょうか? –

答えて

4

はこれが何をしたいですか?

>>> class A: 
... def a(self): 
... print "Hello" 
... 
>>> B = [A() for i in xrange(10)] 
>>> map(lambda a: a.a(), B) 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
[None, None, None, None, None, None, None, None, None, None] 
+0

パーフェクト、ありがとう。今すぐテストしてみてください... –

3

mapをPythonで使用することはほとんどありません。それはリスト内包表記によってほぼ完全に廃止されています。

class A(object): 
    def a(self): 
     print "Hello" 

B = [A() for i in xrange(10)] 
[obj.a() for obj in B] 
+0

'[A()。xrange(i)in i(x)] ' – martineau

+0

@martineau:これは彼が尋ねたものではありません。 –

+0

すみません、ごめんなさい。 – martineau

0

map()、リスト内包の両方が、各オブジェクトのメソッドを呼び出した結果のリストを生成します。彼らは短いと甘いので、それは問題ではない場合は行く方法です。

セットアップ時間が長くなりますが、結果リストの作成を避け、各呼び出しで1つ以上の引数を渡すこともできます。これは、multiprocessing.Poolオブジェクトのapply()メソッドと多少似ています。

class A(object): 
    def a(self): 
     print "Hello" 
    def b(self, name): 
     print "Hello", name 

def apply_method(method, seq, *args): 
    if args: 
     generator = (getattr(obj, method)(*args) for obj in seq) 
    else: 
     generator = (getattr(obj, method)() for obj in seq) 
    try: 
     while True: 
      generator.next() 
    except StopIteration: 
     pass 

B = [A() for i in xrange(10)] 

apply_method('a', B) 
apply_method('b', B, 'Guido') 
関連する問題