Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのvars()関数とは?__dict__属性の取得方法を実例付きで解説

vars() 関数は、Python標準ライブラリに組み込まれているビルトイン関数の一つです。指定したオブジェクトに関連付けられた __dict__ 属性(オブジェクトが保持する属性やメソッドの情報を格納した辞書)を返します。

基本構文

vars(object)

戻り値

<辞書型(Dictionary)>

パラメータについて

vars() 関数が受け取る引数は1つだけです。引数には、モジュール、クラス、あるいは __dict__ 属性を持つ任意のオブジェクトを指定できます。

この引数は省略可能です。引数なしで呼び出した場合は、現在のローカルシンボルテーブルを含む辞書が返されます。

発生しうる例外

渡された引数が __dict__ 属性と一致しない場合、TypeError 例外が発生します。例えば、__dict__ 属性を持たないオブジェクトを渡すとエラーになるため注意が必要です。

スコープとの関係

引数を指定せずに vars() を呼び出すと、locals() メソッドと同じ動作をします。locals() は、現在のローカルシンボルテーブルを表す辞書を更新して返すメソッドです。

内部の仕組み

クラスが定義されると、以下のような処理が行われます。

  • クラス名は __name__ 属性に関連付けられる
  • 基底クラスのタプルは __bases__ 属性に関連付けられる
  • クラス本体に定義された内容を含む現在の名前空間(辞書)が、標準的な辞書型としてコピーされ、__dict__ 属性として表示される

それでは、いくつかの具体例を見ながら vars() 関数の使い方を理解していきましょう。

例1:インスタンスの __dict__ を取得する

class test:
    def __init__(self, integer_1=555, integer_2=787):
        self.integer_1 = integer_1
        self.integer_2 = integer_2

obj_test = test()
print(vars(obj_test))

実行結果

{'integer_1': 555, 'integer_2': 787}

例2:クラス自体の __dict__ を取得する

class sample:
    company = "Tutorial's Point"
    Number = 4
    Topic = "Python 3.x."

obj = vars(sample)
print(obj)

実行結果

{'__doc__': None, '__weakref__': <attribute '__weakref__' of 'sample' objects>, 'Topic': 'Python 3.x.', 'company': "Tutorial's Point", '__module__': '__main__', 'Number': 4, '__dict__': <attribute '__dict__' of 'sample' objects>}

例3:ローカル変数を取得する

class test():
    # Python の __repr__() 関数はオブジェクトの文字列表現を返します。
    # タプル、リスト、辞書、文字列、セットなど、有効な式を含めることができます。
    def __repr__(self):
        return "Tutorial's point"

    def localvariables(self):
        number = 4
        return locals()

if __name__ == "__main__":
    obj = test()
    print(obj.localvariables())

実行結果

{'self': Tutorial's point, 'number': 4}

各例の解説

例1では、コンストラクタ(__init__ メソッド)でデフォルト値が設定された __dict__ 属性の使用方法を示しています。インスタンス変数が辞書形式で確認できるのがポイントです。

例2では、クラスそのものに関連付けられた __dict__ 属性の使用方法を示しています。ドキュメント文字列が未定義のため、__doc__ 属性は None になっています。

例3では、クラス内でユーザー定義されたメソッドの中で、ローカルスコープの変数に対して __dict__ 属性(locals() の結果)を使用する方法を示しています。

まとめ

本記事では、Python 3.x における vars() 関数のさまざまな活用方法を学びました。インスタンス・クラス・ローカルスコープそれぞれに対して使えることを確認しました。必要に応じて、ここで紹介したアルゴリズムをそのまま応用すれば、vars() 関数を効果的に活用できます。デバッグ時やオブジェクトの属性を動的に確認したい場面で特に役立つ関数なので、ぜひ覚えておきましょう。

  1. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値

  2. Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法

    この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print