が上がるようになるでしょうpythonでは、デルやdelattr?
質問
この馬鹿げ、そして心暗鬼の状態の感覚。
Pythonく二つの内蔵の方法で削除する属性からオブジェ、 del コマンド語に delattr 内蔵機能です。ります。 delattr のでは思えない少しより明示的に:
del foo.bar
delattr(foo, "bar")
もったいうわきの下のフードが違います。
解決
まず、第二のより効率的です。 del foo.bar
は、2つのバイトコード命令にコンパイルされます:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
delattr(foo, "bar")
は5をとるのに対します:
2 0 LOAD_GLOBAL 0 (delattr)
3 LOAD_FAST 0 (foo)
6 LOAD_CONST 1 ('bar')
9 CALL_FUNCTION 2
12 POP_TOP
これはのわずかの速い(しかし、それは大きな違いはありません - 私のマシンで0.15マイクロ秒)を実行している最初に翻訳ます。
他の人が言ってきたのように、あなたが本当にあなただけは削除している属性が動的に決定された二番目の形式を使用する必要があります。
[コンパイラはLOAD_FAST
とLOAD_GLOBAL
を使用することができる機能、内部で生成されたバイトコード命令を表示するように編集]
他のヒント
- del がより明示的、効率
- delattr 能動的属性を削除する.
検討例えば次のようなものが挙げられ
for name in ATTRIBUTES:
delattr(obj, name)
または:
def _cleanup(self, name):
"""Do cleanup for an attribute"""
value = getattr(self, name)
self._pre_cleanup(name, value)
delattr(self, name)
self._post_cleanup(name, value)
できない del.
紛れもなく元。私の見解では、これはfoo.bar
がgetattr(foo, "bar")
よりも優れているかどうかを尋ねるようなものである、と私は誰もがその質問をされるとは思わない:)
これは本当に好みの問題ですが、最初はおそらく望ましいです。あなたは事前に削除している属性の名前がわからない場合、私は唯一の第二1を使用すると思います。
ただ、GETATTRとSETATTRのように、delattrにのみ使用する必要があります。
その意味では、そのような__import__
代わりのimport
とoperator.add
代わりの+
内部の仕組みについて確認が、コードの再利用性のないとデルを使用して、ジャーク同僚の視点になることはありません。それは、より明確にし、同様に他の言語から来た人々によって理解さです。
delattr
がより明示的であると考えられる場合は、、なぜgetattr
すべての時間ではなく、object.attr
を使用していない?
フードの下については...あなたの推測は私と同じくらい良いです。有意に良好でない場合ます。
これは、古い質問ですが、私は私の2セントをつけたいと思います。
けれども、del foo.bar
はあなたがdelattr(foo, "bar")
が必要になります倍で、よりエレガントです。あなたは、ユーザーが動的にのはの名前を入力して、オブジェクト内のすべてのメンバーを削除することを可能にする対話型のコマンドラインインターフェイスを持っているならば、あなたは後者の形式を使用するしかない、と言っています。