这可能很傻,但它已经在我的大脑后面困扰了一段时间。

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

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

但我想知道它们之间是否有本质上的区别。


当前回答

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

从这个意义上说,它大致相当于一些python特性,这些特性用于访问比通常可用的更低级别的内置功能,例如__import__而不是import和operator。用加法代替+

其他回答

如果您认为delattr更显式,那么为什么不一直使用getattr而不是object.attr呢?

至于引擎盖下面……你的猜测和我的一样。如果没有明显好转的话。

不确定内部工作原理,但从代码可重用性和不要成为一个混蛋同事的角度来看,使用del。来自其他语言的人也能更清楚地理解它。

Del更加明确和高效; Delattr允许动态删除属性。

考虑以下例子:

for name in ATTRIBUTES:
    delattr(obj, name)

or:

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)

你不能和德尔在一起。

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

从这个意义上说,它大致相当于一些python特性,这些特性用于访问比通常可用的更低级别的内置功能,例如__import__而不是import和operator。用加法代替+

毫无疑问是前者。在我看来,这就像问foo。bar比getattr(foo, "bar")更好,我不认为有人会问这个问题:)