我想按属性、类型或其他条件缩小列表中元素的范围。在
类似elements.only_type(Flower).get_nearest_to(player)
的东西看起来比min(filter(lambda i: isinstance(i, Flower), elements), lambda i: i.pos.distance_to(player.pos)
好看得多。在
从效率、干净的代码和简单性的角度来看,以下是一个好主意吗? 或者已经有一个好的方法,实现或者设计模式吗?在
class Selector(object):
def __init__(self, selection):
self.s3l3ct1on = selection
def __getattr__(self, name):
return type(self)(getattr(el, name) for el in self.s3l3ct1on)
def __iter__(self):
return iter(self.s3l3ct1on)
def filter(self, function):
return type(self)(filter(function, self.s3l3ct1on))
它的用法如下:(A
只是一个具有两个属性的类:a
和b
)
为了简单起见,可以将类本身作为list的子类。在
与
Selector
相同您提到的每种选择过程都可以用
itertools
迭代器来定义。下面的内容形式化了这一点,并且可以很容易地扩展到支持更多种类。使用它的语法似乎非常易读。在虽然我没有做任何性能测试,但我希望结果是有竞争力的,因为几乎所有的开销都在构造函数方法中。唯一可能要快一点的方法是用等价的
itertools
迭代器函数替换它的用法,因此如果您希望进行大量此类处理,那么它可能是一个有效的方便工具。在相关问题 更多 >
编程相关推荐