質問

この馬鹿げ、そして心暗鬼の状態の感覚。

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_FASTLOAD_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.bargetattr(foo, "bar")よりも優れているかどうかを尋ねるようなものである、と私は誰もがその質問をされるとは思わない:)

これは本当に好みの問題ですが、最初はおそらく望ましいです。あなたは事前に削除している属性の名前がわからない場合、私は唯一の第二1を使用すると思います。

属性名が不明な場合、

ただ、GETATTRとSETATTRのように、delattrにのみ使用する必要があります。

その意味では、そのような__import__代わりのimportoperator.add代わりの+

などの組み込み機能あなたが正常に利用できる持っているより低いレベルでのアクセスに使用されるいくつかのPythonの機能とほぼ同じです

内部の仕組みについて確認が、コードの再利用性のないとデルを使用して、ジャーク同僚の視点になることはありません。それは、より明確にし、同様に他の言語から来た人々によって理解さです。

あなたはdelattrがより明示的であると考えられる場合は、

、なぜgetattrすべての時間ではなく、object.attrを使用していない?

フードの下については...あなたの推測は私と同じくらい良いです。有意に良好でない場合ます。

これは、古い質問ですが、私は私の2セントをつけたいと思います。

けれども、del foo.barはあなたがdelattr(foo, "bar")が必要になります倍で、よりエレガントです。あなたは、ユーザーが動的にのはの名前を入力して、オブジェクト内のすべてのメンバーを削除することを可能にする対話型のコマンドラインインターフェイスを持っているならば、あなたは後者の形式を使用するしかない、と言っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top