3.3.6 属性和元素“获取方法”
operator模块最特别的特性之一是获取方法(getter)的概念。获取方法是运行时构造的一些callable对象,用来获取对象的属性或序列的内容。获取方法在处理迭代器或生成器序列时特别有用,因为获取方法引入的开销会大大低于lambda或python函数的开销。
from operator import *
class MyObj:
"""example class for attrgetter"""
def __init__(self,arg):
super().__init__()
self.arg = arg
def __repr__(self):
return 'MyObj({})'.format(self.arg)
l = [MyObj(i) for i in range(5)]
print('objects :',l)
# Extract the 'arg' value from each object.
g = attrgetter('arg')
vals = [g(i) for i in l]
print('arg values:',vals)
# Sort using arg.
l.reverse()
print('reversed :',l)
print('sorted :',sorted(l,key=g))
属性获取方法类似于lambda x,n=‘attrname’: getattr(x,n):
运行结果:
元素获取方法类似于lambda x,y = 5: x[y]:
from operator import *
l = [dict(val=-1 * i) for i in range(4)]
print('Dictionaries:')
print(' original:',l)
g = itemgetter('val')
vals = [g(i) for i in l]
print(' Values:',vals)
print(' Sorted:',sorted(l,key=g))
print
l = [(i,i * -2) for i in range(4)]
print('\nTuples:')
print(' original:',l)
g = itemgetter(1)
vals = [g(i) for i in l]
print(' valies:',vals)
print(' sorted:',sorted(l,key=g))
除了序列,元素获取方法还适用于映射。
运行结果: