这可能是愚蠢的,但它一直唠叨我的大脑了一会儿回来。
Python的为我们提供了两个内置的方式,从对象删除属性,del命令字和delattr内置功能。 我喜欢delattr因为我觉得它有点更明确:
del foo.bar
delattr(foo, "bar")
但我不知道是否有可能是它们之间在引擎罩的差异。
这可能是愚蠢的,但它一直唠叨我的大脑了一会儿回来。
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微秒我的机器上)。
像其他人所说的,你真的应该只使用第二种形式时,动态地确定你要删除的属性。
[编辑来显示的功能,其中,所述编译器可以使用内部产生的字节码指令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")
再说,如果你有一个交互式命令行界面,允许用户通过键入名称动态地删除对象中的任何成员,那么你别无选择,只能使用后者的形式。