hasattr检查函数是否具有属性

时间:2017-12-24 18:10:54

标签: python oop

我只是在看一个以对象为参数的hasattr方法。

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

def trial():
    name = "james"

hasattr(trial, "name")

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

2 个答案:

答案 0 :(得分:1)

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

>>> trial.__code__.co_varnames
('name',)

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

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

>>> def trial():
...     name = "james"
... 
>>> trial.foo = 'bar'
>>> hasattr(trial, 'foo')
True
>>> getattr(trial, 'foo')
'bar'

为函数分配属性的方法是说<func>.<attr_name> = <attr_value>,就像允许它的任何其他对象一样。

(并不是说这必然是达到预期结果的最佳方式,但只是作为可能的演示)

答案 1 :(得分:1)

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

尝试在代码末尾添加:

>>> trial.__dir__()

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

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

>>> trial.foo = 'bar'
>>> dir(trial)  # Equivalent to trial.__dir__(). 'foo' is now in the list.
>>> hasattr(trial, 'foo')
>>> print(trial.foo)

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