如何使用operator模块中的attrgetter和methodcaller实现属性和方法调用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计452个文字,预计阅读时间需要2分钟。
`attrgetter` 和 `itemgetter` 功能类似,它们都用于根据属性名创建函数,用于从对象中提取属性值。`attrgetter` 创建的函数可以直接从对象中获取属性,而 `itemgetter` 创建的函数则可以用于从元组或列表中提取元素。
例如,使用 `attrgetter`:pythonfrom operator import attrgetter
class Person: def __init__(self, name, age): self.name=name self.age=age
person=Person('Alice', 30)print(attrgetter('name')(person)) # 输出: Aliceprint(attrgetter('age')(person)) # 输出: 30
如果传递多个属性名给 attrgetter,它会返回一个元组print(attrgetter('name', 'age')(person)) # 输出: ('Alice', 30)
如果参数名中包含 `.`(点号),则 `attrgetter` 会尝试从对象中获取嵌套属性:pythonclass Person: def __init__(self, name, address): self.name=name self.address=address
person=Person('Alice', {'city': 'New York', 'street': '5th Avenue'})
print(attrgetter('address.city')(person)) # 输出: New Yorkprint(attrgetter('address.street')(person)) # 输出: 5th Avenue
attrgetter
attrgetter 与 itemgetter 作用类似, 它创建的函数根据名称提取对象的属性。 如果把多个属性名传给 attrgetter, 它也会返回提取的值构成的元组。 此外, 如果参数名中包含 .(点号) , attrgetter 会深入嵌套对象, 获取指定的属性。
from collections import nametuple # 命名元组 LatLong = namedtuple('LatLong', 'lat long') Metropolis = namedtuple('Metropolis', 'name cc pop coord') metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long)) for name, cc, pop, (lat, long) in metro_data] from operator import attrgetter name_lat = attrgetter('name', 'coord.lat') for item in sorted(metro_areas, key=attrgetter('coord.lat')): print(name_lat(item))可以应用到实际项目中。dict比较占用内存。nametuple是个不错的选择。搭配attrgetter有很多可能
methodcaller
它的作用与 attrgetter 和 itemgetter 类似, 它会自行创建函数
有点类似getattr的感觉,但是却有点不一样
本文共计452个文字,预计阅读时间需要2分钟。
`attrgetter` 和 `itemgetter` 功能类似,它们都用于根据属性名创建函数,用于从对象中提取属性值。`attrgetter` 创建的函数可以直接从对象中获取属性,而 `itemgetter` 创建的函数则可以用于从元组或列表中提取元素。
例如,使用 `attrgetter`:pythonfrom operator import attrgetter
class Person: def __init__(self, name, age): self.name=name self.age=age
person=Person('Alice', 30)print(attrgetter('name')(person)) # 输出: Aliceprint(attrgetter('age')(person)) # 输出: 30
如果传递多个属性名给 attrgetter,它会返回一个元组print(attrgetter('name', 'age')(person)) # 输出: ('Alice', 30)
如果参数名中包含 `.`(点号),则 `attrgetter` 会尝试从对象中获取嵌套属性:pythonclass Person: def __init__(self, name, address): self.name=name self.address=address
person=Person('Alice', {'city': 'New York', 'street': '5th Avenue'})
print(attrgetter('address.city')(person)) # 输出: New Yorkprint(attrgetter('address.street')(person)) # 输出: 5th Avenue
attrgetter
attrgetter 与 itemgetter 作用类似, 它创建的函数根据名称提取对象的属性。 如果把多个属性名传给 attrgetter, 它也会返回提取的值构成的元组。 此外, 如果参数名中包含 .(点号) , attrgetter 会深入嵌套对象, 获取指定的属性。
from collections import nametuple # 命名元组 LatLong = namedtuple('LatLong', 'lat long') Metropolis = namedtuple('Metropolis', 'name cc pop coord') metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long)) for name, cc, pop, (lat, long) in metro_data] from operator import attrgetter name_lat = attrgetter('name', 'coord.lat') for item in sorted(metro_areas, key=attrgetter('coord.lat')): print(name_lat(item))可以应用到实际项目中。dict比较占用内存。nametuple是个不错的选择。搭配attrgetter有很多可能
methodcaller
它的作用与 attrgetter 和 itemgetter 类似, 它会自行创建函数
有点类似getattr的感觉,但是却有点不一样

