operator模块中的 attrgetter、itemgetter、methodcaller 三个方法其实就是python中的闭包。传入一个,多个参数,返回一个可调用的函数。通过闭包实现调用不同的对象,而不同的对象使用同样的入参参数。返回一个可调用的函数的对象参数,可以使用闭包传入的参数。
attrgetter 获得对象指定的属性值 — 属性选择器
>>> class Student:
... def __init__(self, no=None, name=None, score=None):
... self.no=no
... self.name=name
... self.score=score
... def add_score(self, value=0):
... self.score += value
...
>>> student = Student("10001", "jack", 80)
>>> f=operator.attrgetter("score")
>>> f(student)
80
>>> f=operator.attrgetter("name","score")
>>> f(student)
('jack', 80)
methodcaller 调用对象指定方法 — 方法选择器
>>> f = operator.methodcaller("add_score")
>>> student.score
80
>>> f(student)
>>> student.score
80
>>> f = operator.methodcaller("add_score", 10)
>>> f(student)
>>> student.score
90
itemgetter 获得可索引对象指定项的值 — 元素项选择器
>>> operator.itemgetter(1)('ABCDEFG')
'B'
>>> operator.itemgetter(1,3,5)('ABCDEFG')
('B', 'D', 'F')
>>> operator.itemgetter(slice(2,None))('ABCDEFG')
'CDEFG'
>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>> getcount = operator.itemgetter(1)
>>> list(map(getcount, inventory))
[3, 2, 5, 1]
>>> sorted(inventory, key=getcount)
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]