首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hasattr检查函数是否有属性

hasattr检查函数是否有属性
EN

Stack Overflow用户
提问于 2017-12-25 02:10:54
回答 2查看 739关注 0票数 0

我只是在看hasattr方法,它接受一个对象作为参数。

来检验“一切都是对象”的理论。我创建了一个具有"name"属性的用户定义函数,但它返回False。我写的代码是:

代码语言:javascript
复制
def trial():
    name = "james"

hasattr(trial, "name")

这是否意味着函数不是对象?如果有人能帮我们解决这个问题我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2017-12-25 02:18:58

函数是对象,但您创建的是一个带有局部变量name的函数,该变量不是该函数的属性。让我们检查一下函数代码:

代码语言:javascript
复制
>>> trial.__code__.co_varnames
('name',)

如您所见,name确实是函数的一个局部变量。

但是,属性仍然可以在函数上定义:

代码语言:javascript
复制
>>> def trial():
...     name = "james"
... 
>>> trial.foo = 'bar'
>>> hasattr(trial, 'foo')
True
>>> getattr(trial, 'foo')
'bar'

将属性分配给函数的方法是使用<func>.<attr_name> = <attr_value>,就像其他任何允许这样做的对象一样。

(并不是说这一定是达到预期结果的最佳方式,而只是演示它是可能的)

票数 1
EN

Stack Overflow用户

发布于 2017-12-25 02:19:59

Python中的函数确实是一个对象,但是函数中的局部变量不是它的属性。

尝试在代码的末尾添加以下内容:

代码语言:javascript
复制
>>> trial.__dir__()

它将显示您定义的函数的所有属性-并且您正在访问function对象的属性。

如果需要,您甚至可以向function对象添加属性,但您必须小心不要覆盖现有属性。试试这个:

代码语言:javascript
复制
>>> trial.foo = 'bar'
>>> dir(trial)  # Equivalent to trial.__dir__(). 'foo' is now in the list.
>>> hasattr(trial, 'foo')
>>> print(trial.foo)

当你的代码正在执行时,函数从它被定义的那一刻起就变成了有形的东西,但其中的变量是短暂的,因为它们是仅在函数执行期间(即当你调用它时)存储在内存中的值,并在函数执行完成后消失。实际上要比这复杂一点,混合了垃圾收集,但从一个简单的角度来看,这几乎就是发生的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47963008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档