2011-07-09 44 views
1

對不起,如果這已被問到,但我無法在網上找到任何東西,以表明這是否可能。我可以解釋最簡單的方法是隻是一個代碼段,與此正好能代表我的問題:使用地圖調用班級功能

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

基本上我想遍歷自定義類的數組,並調用類的功能。作爲參考,如果它的問題類的功能是自包含的並且不返回任何內容,它會導致內部變量的更改。任何幫助真的很感激,並在一天結束時,我想與multiprocessing.Pool使用它。

感謝, 阿里

+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

你幾乎從來沒有想在Python中使用map;它幾乎完全被列表理解所淘汰。

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

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

'[A()。a()for xrange(10)]' – martineau

+0

@martineau:這不是他問的。 –

+0

猜對了,對不起。 – martineau

0

map()和list解析都將生成調用每個對象的方法的結果的列表。如果這不是問題,那麼它們就是要走的路,因爲它們既短又甜。

下面是一個不同的方法,可以設置更長的時間,但可以避免創建結果列表,並且還可以處理每次調用時傳遞的一個或多個參數。它有點類似於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')