题
这可能很愚蠢,但它已经困扰我一段时间了。
Python 为我们提供了两种从对象中删除属性的内置方法, 德尔 命令字和 德拉特尔 内置功能。我更喜欢 德拉特尔 因为我认为它更明确一点:
del foo.bar
delattr(foo, "bar")
但我想知道它们之间是否存在潜在的差异。
解决方案
首先是比所述第二效率更高。 del foo.bar
编译为2个字节码指令:
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微秒我的机器上)。
像其他人所说的,你真的应该只使用时都会删除属性是动态确定的第二种形式。
[编辑来显示的功能,其中,所述编译器可以使用LOAD_FAST
和LOAD_GLOBAL
内部产生的字节码指令]
其他提示
- 德尔 更加明确和高效;
- 德拉特尔 允许动态属性删除。
考虑以下示例:
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)
你不能这样做 德尔.
毫无疑问前者。在我看来,这就像问foo.bar
是否比getattr(foo, "bar")
更好,我不认为任何人在问这个问题:)
这真是喜好的问题,但第一个可能是优选的。我只用第二个,如果你不知道你删除的时间提前属性的名称。
就像GETATTR和SETATTR,只应在属性名是未知的使用delattr。
在这个意义上说,它是大致相当于其用于访问多个蟒特征内置功能在较低的水平比你通常有可用的,例如__import__
代替import
和operator.add
代替+
不确定的内部工作,但是从代码重用,不要加加速度同事的角度来看,使用删除。它更清晰,人们从其他语言的充分理解。
如果你认为 delattr
更明确,那为什么不使用 getattr
一直而不是 object.attr
?
至于幕后...你的猜测和我的一样好。如果没有明显好转。
这是一个老问题,但我想将我的2美分
虽然,del foo.bar
更优雅,有时你需要delattr(foo, "bar")
。说,如果有一个交互式命令行界面,它允许用户通过动态地删除任何构件在对象的输入名称,则没有选择,只能使用后一种形式。