这可能很傻,但它已经在我的大脑后面困扰了一段时间。
Python为我们提供了两种从对象中删除属性的内置方法,del命令字和delattr内置函数。我更喜欢delattr,因为我认为它更明确:
del foo.bar
delattr(foo, "bar")
但我想知道它们之间是否有本质上的区别。
这可能很傻,但它已经在我的大脑后面困扰了一段时间。
Python为我们提供了两种从对象中删除属性的内置方法,del命令字和delattr内置函数。我更喜欢delattr,因为我认为它更明确:
del foo.bar
delattr(foo, "bar")
但我想知道它们之间是否有本质上的区别。
当前回答
不确定内部工作原理,但从代码可重用性和不要成为一个混蛋同事的角度来看,使用del。来自其他语言的人也能更清楚地理解它。
其他回答
这是一个老问题,但我想提出我的意见。
不过,del foo。Bar更优雅,有时你需要delattr(foo, " Bar ")。例如,如果您有一个交互式命令行界面,允许用户通过键入名称动态删除对象中的任何成员,那么您别无选择,只能使用后一种形式。
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)
你不能和德尔在一起。
不确定内部工作原理,但从代码可重用性和不要成为一个混蛋同事的角度来看,使用del。来自其他语言的人也能更清楚地理解它。
这确实是一个偏好问题,但第一个可能更可取。如果您不知道要提前删除的属性的名称,我只使用第二个。
毫无疑问是前者。在我看来,这就像问foo。bar比getattr(foo, "bar")更好,我不认为有人会问这个问题:)