[解決済み] Pythonのdir(...)とvars(...).keys()の違いとは?
質問
の違いは何ですか?
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__
を探し、そこでそれを見つけて
m
で
x
を第一引数として与えます。
ということで、その差は
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']
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonで標準エラー出力するには?
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] スロットの使い方__?
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?