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)]