はじめに
Pythonでオブジェクトの属性を取得する際、通常は直接 object.attribute
のような形でアクセスします。しかし、複数の属性を動的に取得したい場合や、高階関数で属性を扱う場合には、operator.attrgetter
が非常に便利です。この記事では、operator.attrgetter
の使い方と、複数の属性を一度に取得する方法を紹介します。
operator.attrgetter
とは
operator.attrgetter
は、Pythonの標準ライブラリ operator
モジュールに含まれる関数です。この関数は、指定された属性名(複数可)に基づいてオブジェクトから属性を取得するためのcallableオブジェクトを返します。
基本的な使い方
まず、簡単な例から見ていきましょう。
from operator import attrgetter
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
# 単一の属性を取得
get_name = attrgetter('name')
print(get_name(p)) # 出力: Alice
# 複数の属性を取得
get_name_and_age = attrgetter('name', 'age')
print(get_name_and_age(p)) # 出力: ('Alice', 30)
実行結果:
Alice
('Alice', 30)
複数オブジェクトの属性を取得する
attrgetter
は、リストやタプルなどの複数のオブジェクトに対しても使用できます。これは、map
や sorted
などの関数と組み合わせる際に特に便利です。
people = [
Person("Alice", 30),
Person("Bob", 25),
Person("Charlie", 35)
]
# 名前のリストを取得
names = list(map(attrgetter('name'), people))
print(names) # 出力: ['Alice', 'Bob', 'Charlie']
# 年齢でソート
sorted_people = sorted(people, key=attrgetter('age'))
for person in sorted_people:
print(f"{person.name}: {person.age}")
実行結果:
['Alice', 'Bob', 'Charlie']
Bob: 25
Alice: 30
Charlie: 35
ネストされた属性の取得
attrgetter
は、ドット記法を使用してネストされた属性にもアクセスできます。
class Address:
def __init__(self, city):
self.city = city
class Person:
def __init__(self, name, address):
self.name = name
self.address = address
p = Person("Alice", Address("Tokyo"))
get_city = attrgetter('address.city')
print(get_city(p)) # 出力: Tokyo
実行結果:
Tokyo
まとめ
operator.attrgetter
は、Pythonでオブジェクトの属性を柔軟に取得するための強力なツールです。特に以下のような場面で活躍します:
- 複数の属性を一度に取得したい場合
- 属性名を動的に指定したい場合
-
map
、filter
、sorted
などの高階関数と組み合わせて使用する場合 - コードの可読性を高めたい場合
attrgetter
を使いこなすことで、より簡潔で効率的なPythonコードを書くことができます。ぜひ、日々のプログラミングに取り入れてみてください。
参考情報
より詳細な情報や公式ドキュメントについては、以下のリンクを参照してください:
これらの公式ドキュメントでは、attrgetter
の詳細な使用方法や、operator
モジュールに含まれる他の便利な関数についても解説されています。