HOWTO · Python

Python でオブジェクトの属性を出力する

このチュートリアルでは、Python でオブジェクトの属性を表示する方法を説明します。

このページの内容

属性名が分かっている場合は、ドット記法で値を取得し、print() に渡して表示できます。属性名が文字列に入っている場合は getattr() を使います。オブジェクトに保存されたインスタンス属性を調べるには、利用できる場合に __dict__ または vars() を使い、オブジェクトが参照できる名前を広く確認するには dir() を使います。それぞれが示す内容は異なるため、必要なのが個別の値、インスタンスの属性マッピング、またはより広い名前の一覧のどれなのかに応じて選びましょう。

Person クラスにはクラス属性を定義でき、各オブジェクトはそれぞれ固有のインスタンス属性も保持できます。以下の例では、名前、年齢、居住地を持つ人物オブジェクトを作成します。

属性名が分かっているときは、ドット記法で値を読むのが最も直接的な方法です。組み込み関数 print() にその値を渡します。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(person.name)
John Doe

この式は、このインスタンスから name の値を取得し、標準出力に書き出します。

getattr 関数を使って Python オブジェクトの属性を出力する

属性名が変数に格納されている場合や、実行時に決まる場合は getattr() を使います。第2引数には文字列を指定します。省略可能な第3引数には、その名前の属性が利用できない場合に返す既定値を指定できます。既定値を省略して属性が見つからないと、AttributeError が発生します。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attribute_name = "city"
city = getattr(person, attribute_name, "Unknown")
print(city)
New York

attribute_name を変更すると別の属性を選べます。既定値も用途に合わせて変更できます。第3引数を指定せず、属性名が見つからない場合は AttributeError が発生します。

__dict__ 属性を使って Python オブジェクトの属性を出力する

インスタンスが __dict__ を公開している場合、そこからそのインスタンスの属性マッピングを取得できます。__init__ 内で self.name に代入した値のように、インスタンス自身に保存された属性が含まれます。クラスだけに定義された属性は含まれません。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attributes = person.__dict__
print(attributes["name"])
John Doe

__slots__ を使い、辞書を持たないクラスのインスタンスなど、インスタンスの __dict__ を公開しないオブジェクトもあります。そのため、この方法をすべてのオブジェクトに使えるわけではありません。

Python の dir() 関数を使ってオブジェクトの属性を出力する

dir(person) を呼び出すと、Python が調査対象として公開する名前を並べたソート済みの一覧が得られます。インスタンス属性やクラス属性だけでなく、メソッドや特殊な名前も含まれることがあるため、保存済みのインスタンスデータだけの一覧ではありません。長い一覧を読みやすく整形するには、標準ライブラリの pprint() 関数を使えます。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print("name" in dir(person))
True

この確認では、name が公開されている名前に含まれることを示しています。実際に得られる名前はオブジェクトやクラスによって異なり、独自の __dir__() が dir() の結果に影響することもあります。そのため、インスタンス辞書の内容をそのまま示すものではなく、名前を調べるための手段として使いましょう。一覧全体を読みやすく表示するには、dir(person) を pprint() 関数に渡します。

vars() 関数を使って Python オブジェクトの属性を出力する

オブジェクトが __dict__ を公開している場合、vars(person) はそのインスタンス属性マッピングを返します。このマッピングを pprint() に渡すと、読みやすい形式で表示できます。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(vars(person)["name"])
John Doe

引数なしの vars() は別の用途で、現在のローカルシンボルテーブルを返します。__dict__ を持たないオブジェクトを渡すと TypeError が発生するため、インスタンスの属性マッピングを取得したい場合に、そのオブジェクトが対応していることを確認して使いましょう。マッピング全体を整形して表示するには、vars(person) を pprint() 関数に渡します。

まとめ

目的に合わせて方法を選びましょう。既知の値を1つ表示するならドット記法と print()、属性名が動的に決まるなら getattr()、オブジェクトが辞書を公開している場合に保存済みのインスタンス属性を調べるなら __dict__ または vars()、より広い名前を見つけるなら dir() を使います。dir() にはメソッドや特殊な名前が含まれることがありますが、インスタンス辞書に含まれるのはそのインスタンス自身に保存された属性です。