处理同一类的大量实例的最佳方法是什么。目前,我将它们添加到列表中,然后循环遍历列表,如果我需要调用方法。
[o.method() for o in myObjects]
有没有办法将它们作为一个集合处理,因为上面的内容可以被替换为
myObjects.method()
我虽然有一个metaClass而不是包含列表的那个列表并且这样做,但我想知道这是否有点令人费解。有没有一种首选的方法呢?
编辑: 我通常不需要返回值
答案 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的Zen声明显式优于隐式,并且可读性很重要,所以没有“收集调用”。句法;你应该明确地说明这一点。
答案 1 :(得分:0)
但是你编写它,在每个对象上运行method
的唯一方法是循环它们(除非你可以重写method
并为列表优化它)。例如,如果您有一些名为myObjects.method
的类方法或收集方法,那么它内部仍会有一些变体
for o in myObjects:
o.method()
答案 2 :(得分: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]