如何使用operator模块中的attrgetter和methodcaller实现属性和方法调用?

2026-04-30 19:391阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计452个文字,预计阅读时间需要2分钟。

如何使用operator模块中的attrgetter和methodcaller实现属性和方法调用?

`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 类似, 它会自行创建函数

如何使用operator模块中的attrgetter和methodcaller实现属性和方法调用?

from operator import methodcaller a = 'hello world' upcase = methodcaller('upper') upcase(a)

有点类似getattr的感觉,但是却有点不一样

本文共计452个文字,预计阅读时间需要2分钟。

如何使用operator模块中的attrgetter和methodcaller实现属性和方法调用?

`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 类似, 它会自行创建函数

如何使用operator模块中的attrgetter和methodcaller实现属性和方法调用?

from operator import methodcaller a = 'hello world' upcase = methodcaller('upper') upcase(a)

有点类似getattr的感觉,但是却有点不一样