在Python,del或delattr哪个更好?

这可能是愚蠢的,但它一直唠叨我的脑后。

Python给了我们两种内置的方法来删除对象的属性, del命令字和delattr内置函数。 我更喜欢delattr,因为我认为它更加明确:

del foo.bar delattr(foo, "bar") 

但是我想知道他们之间是否存在差异。

第一个比第二个更有效率。 del foo.bar编译成两个字节码指令:

  2 0 LOAD_FAST 0 (foo) 3 DELETE_ATTR 0 (bar) 

delattr(foo, "bar")需要五个:

  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μs)。

像其他人所说的那样,当你正在删除的属性是dynamic确定的时候,你应该只使用第二种forms。

[编辑显示在函数内部生成的字节码指令,其中编译器可以使用LOAD_FASTLOAD_GLOBAL ]

  • 德尔更加明确和高效;
  • delattr允许dynamic属性删除。

考虑下面的例子:

 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") ,我不认为有人问这个问题:)

这实际上是一个偏好的问题,但第一个可能是可取的。 如果您不知道要删除的属性的名称,我只能使用第二个。

就像getattr和setattr一样,delattr只能在属性名称未知时使用。

从这个意义上说,它大致相当于用于访问内置function的几个python特性,这些特性比通常的可用级别更低,比如__import__代替importoperator.add而不是+

不确定内部运作,但从代码的可重用性,不要成为一个混蛋同事的angular度来看,使用德尔。 来自其他语言的人也更加清楚和理解。

这是一个古老的问题,但我想把我的2美分。

虽然, del foo.bar更优雅,有时你需要delattr(foo, "bar") 。 比方说,如果你有一个交互式命令行界面,允许用户通过input名字dynamic删除对象中的任何成员,那么你别无select,只能使用后一种forms。

如果你认为delattr更明确,那么为什么不一直使用getattr而不是object.attr

至于引擎盖下,你的猜测和我的一样好。 如果不是显着更好。