處理大量同一類的實例的最佳方法是什麼?目前,我將它們添加到列表中,然後在列表中循環,如果我需要調用方法。處理python中大量對象的最佳方法
[o.method() for o in myObjects]
有沒有辦法來對付他們作爲在這個意義上的集合,以上可以用的東西雖然有元類,而不是包含該列表的替代像
myObjects.method()
我列表並做到這一點,但我想知道這是否有點複雜。有沒有一種首選的方法來做到這一點?
編輯: 我一般不會需要返回值
處理大量同一類的實例的最佳方法是什麼?目前,我將它們添加到列表中,然後在列表中循環,如果我需要調用方法。處理python中大量對象的最佳方法
[o.method() for o in myObjects]
有沒有辦法來對付他們作爲在這個意義上的集合,以上可以用的東西雖然有元類,而不是包含該列表的替代像
myObjects.method()
我列表並做到這一點,但我想知道這是否有點複雜。有沒有一種首選的方法來做到這一點?
編輯: 我一般不會需要返回值
一些變化。如果你想擁有所有這些方法的返回值調用列表,然後使用或者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的禪說明顯比隱式和可讀性更好,因此不存在「集合調用」語法;你需要明確地說明這一點。
但是你寫的,對每個對象上運行method
的唯一途徑是通過循環在他們(除非你可以重寫method
並優化它的列表) 。例如,如果你有一些所謂的myObjects.method
,類方法或收集方法在內部也仍然有
for o in myObjects:
o.method()
你也可以爲了處理這種情況的子類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]
你想要這些方法調用的*返回值*嗎?還是被丟棄了? –