1. ホーム
  2. python

[解決済み] Pythonのdir(...)とvars(...).keys()の違いとは?

2023-08-30 15:29:18

質問

の違いは何ですか? dir(…)vars(…).keys() をPythonで使うのですか?

(違いがあるといいのですが、そうでなければ、これは "一つの方法"の原則を破ることになりますから... :)。

どのように解決するのですか?

Pythonのオブジェクトは通常、オブジェクトに属する辞書にインスタンス変数を格納します(スロットは除く)。 vars(x) はこの辞書を返します(同様に x.__dict__ ). dir(x) の辞書を返します。 x の属性、そのクラスの属性、そして再帰的にそのクラスの基底クラスの属性の辞書を返します。

ドット演算子を使ってオブジェクトの属性にアクセスするとき、Pythonはそのオブジェクトの辞書で属性を探すだけでなく、もっとたくさんのことをします。よくあるケースは x がクラスのインスタンスである場合です。 C のインスタンスであり、そのメソッドを呼び出すと m :

class C:
    def m(self):
        print("m")
    
x = C()
x.m()

メソッド m に格納されていない x.__dict__ . これはクラスの属性です。 C .

を呼び出すと x.m() を呼び出すと、Python はまず m を探します。 x.__dict__ の中にありますが、それを見つけることはできません。しかし、それは x のインスタンスであることは知っています。 C のインスタンスなので、次に探すのは C.__dict__ を探し、そこでそれを見つけて mx を第一引数として与えます。

ということで、その差は vars(x)dir(x) は、その dir(x) を探すという余分な作業をします。 x のクラス (およびその のベース に格納されている属性だけでなく、そこからアクセス可能な属性のためのものです。 x のシンボルテーブルに格納されている属性だけではありません。上の例では vars(x) は空の辞書を返しますが、これは x はインスタンス変数を持たないので、空の辞書を返します。しかし dir(x)

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', 
'__init__', '__init_subclass__', '__le__', '__lt__', '__module__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'm']