这可能是愚蠢的,但它一直在唠叨我的脑后.
Python为我们提供了两种从对象中删除属性的内置方法,del命令字和delattr内置函数.我更喜欢delattr,因为我觉得它更明确一点:
del foo.bar
delattr(foo, "bar")
Run Code Online (Sandbox Code Playgroud)
但我想知道他们之间是否存在引擎盖下的差异.
Mil*_*les 252
第一个比第二个更有效. del foo.bar编译为两个字节码指令:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
Run Code Online (Sandbox Code Playgroud)
而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
Run Code Online (Sandbox Code Playgroud)
这转化为第一次运行稍快(但它不是一个巨大的差异 - 在我的机器上.15μs).
就像其他人所说的那样,当您要删除的属性是动态确定的时候,您应该只使用第二种形式.
[编辑显示函数内部生成的字节码指令,编译器可以使用LOAD_FAST和LOAD_GLOBAL]
Ole*_*rov 37
请考虑以下示例:
for name in ATTRIBUTES:
delattr(obj, name)
Run Code Online (Sandbox Code Playgroud)
要么:
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)
Run Code Online (Sandbox Code Playgroud)
del不能这样做.
Ale*_*nor 17
毫无疑问是前者.在我看来,这就像问是否foo.bar更好getattr(foo, "bar"),我认为没有人问这个问题:)
就像getattr和setattr一样,delattr只应在属性名称未知时使用.
从这个意义上说,它大致相当于几个用于访问内置功能的python功能,而不是通常可用的功能,例如__import__代替import和operator.add代替+