今回は、オブジェクトの __dict__
属性を返す Python vars() 関数の使い方を見ていきましょう。
これは珍しい関数ですが、特定の状況で役に立つので、どのように使うかを見るのに役立ちます。
では、具体的な例を使って、これらの状況を見てみましょう。
Python vars() のシンタックス
この関数はオブジェクト obj
を引数にとり、以下のような形式で実行される。
vars ([obj])
|
これは obj
の __dict__
属性を返す。
この属性には、書き込み可能なオブジェクトのすべての属性が含まれる。
ここで、obj
には、モジュール / クラス / クラスのインスタンスなどを指定することができます。
ここで、引数の型と数によって、いくつかのケースがある。
- 引数を与えない場合、Pythonの
vars()
はlocals()
メソッドと同じように動作し、現在のローカルシンボルテーブルを持つ辞書を返します。 - このメソッドは
__dict__
属性を返すので、もしオブジェクトがこの属性を持っていなければ、TypeError
例外が発生します。
それでは、異なるオブジェクトに関連するいくつかの例を見てみましょう。
Python の vars() を引数なしで使う場合
前述のように、これは locals()
メソッドとして動作し、ローカルシンボルテーブルの辞書を返します。
print ( vars ())
|
結果は以下の通りです。
{ '__name__' : '__main__' , '__doc__' : None , '__package__' : None , '__loader__' : <_frozen_importlib_external.SourceFileLoader object at 0x108508390 >, '__spec__' : None , '__annotations__' : {}, '__builtins__' : <module 'builtins' (built - in )>, '__file__' : '/Users/vijay/home/python_vars_function.py' , '__cached__' : None , 'Data' : < class '__main__.Data' >, 'd' : <__main__.Data object at 0x108565048 >, 'math' : <module 'math' from '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload/math.cpython-36m-darwin.so' >}
|
Python vars() をクラスオブジェクトで使う
もし obj
がクラスタイプ、またはクラスのインスタンスであるなら、この場合 vars()
が何をするのかを見てみましょう。
ここでは、クラス MyClass
を作成し、その __init__()
メソッドにいくつかの属性を定義してみましょう。
class MyClass:
def __init__( self , i, j):
self .a = i
self .b = j
m = MyClass( 10 , 20 )
print ( vars (m))
print ( vars (MyClass))
|
結果は以下の通りです。
{ 'a' : 10 , 'b' : 20 }
{ '__module__' : '__main__' , '__init__' : <function MyClass.__init__ at 0x000001C24EA129D8 >, '__dict__' : <attribute '__dict__' of 'MyClass' objects>, '__weakref__' : <attribute '__weakref__' of 'MyClass' objects>, '__doc__' : None }
|
クラスインスタンスの場合、 vars()
は関連するすべての属性 a
と b
を、その値とともに返します。
一方、クラス MyClass
の場合は、main
モジュールの下にカプセル化されており、クラスの __dict__
属性と共に __init__
メソッドを持っています。
vars()
は __repr__
や __dict__
などのすべてのダンダメソッドを呼び出します。
そのため、ダンダーのメソッドを呼び出すよりも、この関数を直接呼び出すことができれば便利です。
(このような違いはありませんが)。
同様に、 vars()
は str
や list
のような他のオブジェクトやクラスでも使用することができる。
print ( vars ( str ))
print ( vars ( list ))
|
これで、両方のクラスについて、関連するすべての属性とインスタンスメソッドが表示されます。
モジュール上でvars()を使用する
この関数はモジュールに対しても使うことができ、そのモジュールが含むすべてのメソッドと、その他の関連情報、そしてドキュメントストリングを見つけることができます
例えば、組み込みモジュールの antigravity
(これはイースターエッグです!) を調べたい場合、それをインポートして vars(antigravity)
を調べます。
import antigravity
print ( vars (antigravity))
|
出力例 (最後の数行)
{ '__name__' : 'antigravity' , '__doc__' : None , '__package__' : ' ', ' TimeoutError ': <class ' TimeoutError '>, ' open ': <built-in function open>, ' quit ': Use quit() or Ctrl-Z plus Return to exit, ' exit ': Use exit() or Ctrl-Z plus Return to exit, ' copyright': Copyright (c) 2001 - 2018 Python Software Foundation.
All Rights Reserved.
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
Copyright (c) 1995 - 2001 Corporation for National Research Initiatives.
All Rights Reserved.
} |
もし、 __dict__
属性を持たないオブジェクト (例えば int
) に対して vars()
を使用すると、 TypeError
が発生します。
print ( vars ( 12 ))
|
Traceback (most recent call last): File "vars_example.py" , line 12 , in <module>
print ( vars ( 12 ))
TypeError: vars () argument must have __dict__ attribute
|
まとめ
この記事では、任意のクラス/モジュール/オブジェクトの属性とすべての代表的なメソッドをすばやく取得したい場合に便利な Python vars() 関数について見てきました。