2014-01-30 67 views
1

處理大量同一類的實例的最佳方法是什麼?目前,我將它們添加到列表中,然後在列表中循環,如果我需要調用方法。處理python中大量對象的最佳方法

[o.method() for o in myObjects] 

有沒有辦法來對付他們作爲在這個意義上的集合,以上可以用的東西雖然有元類,而不是包含該列表的替代像

myObjects.method() 

我列表並做到這一點,但我想知道這是否有點複雜。有沒有一種首選的方法來做到這一點?

編輯: 我一般不會需要返回值

+0

你想要這些方法調用的*返回值*嗎?還是被丟棄了? –

回答

5

一些變化。如果你想擁有所有這些方法的返回值調用列表,然後使用或者map()或列表的理解是處理均勻對象序列的正確方法:

from operator import methodcaller 
results = map(methodcaller('method'), myObjects) 

在Python 3,map()返回一個發電機來代替,而產生一個名單是最有效的,只是用一個列表理解:

results = [o.method() for o in myObjects()] 

但是,如果所有您感興趣的是方法調用本身,並且您放棄返回值(例如,因爲它是None),那麼您現在創建一個沒有任何內容的列表對象。您正在使用列表理解的副作用,並在此過程中不必要地生成大量None引用。

在這種情況下,你只需要使用一個簡單的for循環:

for o in myObjects: 
    o.method() 

因爲Python的動態特性,也沒有辦法爲Python知道,如果一個對象序列都具有相同的方法,任何情況。由於Python的禪說明顯比隱式和可讀性更好,因此不存在「集合調用」語法;你需要明確地說明這一點。

0

但是你寫的,對每個對象上運行method的唯一途徑是通過循環在他們(除非你可以重寫method並優化它的列表) 。例如,如果你有一些所謂的myObjects.method,類方法或收集方法在內部也仍然有

for o in myObjects: 
    o.method() 
0

你也可以爲了處理這種情況的子類list

class customList(list): 
    def __getattribute__(self, attr): 
     try: 
      return super(customList, self).__getattribute__(attr) 
     except AttributeError: 
      method_list = [getattr(el, attr) for el in self] 
      def call_me(*args, **kwargs): 
       return [method(*args, **kwargs) for method in method_list] 
      return call_me 

下面是測試類:

class Test: 
    _instances = customList() 

    def __init__(self, arg=0): 
     self._instances.append(self) 
     self.nb = arg 

    def incr(self, arg): 
     self.nb += arg 

    def get_nb(self): 
     return self.nb 

    @classmethod 
    def get_instances(cls): 
     return cls._instances 

這是你會得到什麼:

>>> a = Test(0) 
>>> b = Test(1) 
>>> c = Test(2) 
>>> instances = Test.get_instances() 
>>> instances.incr(3) 
[None, None, None] 
>>> instances.get_nb() 
[3, 4, 5] 
相關問題