gpt4 book ai didi

python - 有人可以解释方法属性上的 Python hasattr/delattr 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:34:47 25 4
gpt4 key购买 nike

我有一个由一些奇怪的行为引起的错误。我可能从根本上遗漏了一些关于函数属性语义的东西。或者它可能是一个错误。我在

$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2

首先,我定义了一个类,并为其其中一个方法添加了一个属性。

>>> class Foo(object):
... def bar(self):
... pass
... bar.xyzzy = 'magic'
...

现在我可以看到它存在于Foo.bar

>>> hasattr(Foo.bar, 'xyzzy')
True

我可以取回它。

>>> Foo.bar.xyzzy
'magic'

>>> getattr(Foo.bar, 'xyzzy')
'magic'

但是我不能删除它。

>>> del Foo.bar.xyzzy
Traceback (most recent call last):
...
AttributeError: 'instancemethod' object has no attribute 'xyzzy'

>>> delattr(Foo.bar, 'xyzzy')
Traceback (most recent call last):
...
AttributeError: 'instancemethod' object has no attribute 'xyzzy'

有什么想法吗?我认为这与 Foo.bar 在这里被报告为“instancemethod”这一事实有关,而不是未绑定(bind)的方法,如果您只是问 Foo.bar 是。但我不确定这是否是预期的副作用,我是否误解了什么,或者是否存在错误。

最佳答案

你应该这样做:

del Foo.bar.im_func.xyzzy

需要im_func来访问真正的方法Foo.barinstancemethod是一种自动处理self传递的装饰器... .


当你使用 getattr 成功访问 Foo.barxyzzy 属性时,我可能已经从你的问题中了解到,就像你来了一样事实上 delattr 的行为方式不同,原因是 getattr 在内部调用 __getattribute__(和 __getattr__) 类和对象的所有父类在第一个参数中,直到找到属性或引发 AttributeError,对于 hasattr 也是如此这相当于:

def hasattr(obj, attr):
try:
getattr(obj, attr)
except AttributeError:
return False
return True

另一方面,出于安全原因(您不想 ( 尝试) 来删除his class 的一个属性,你会不会:-)。

关于python - 有人可以解释方法属性上的 Python hasattr/delattr 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6967937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com