我只是在看一个以对象为参数的hasattr
方法。
检查"一切都是对象"理论。我创建了一个具有属性"name"
的用户定义函数,但它返回False
。我写的代码是:
def trial():
name = "james"
hasattr(trial, "name")
这是否意味着函数不是对象?如果有人能帮我们解决这个问题,我将不胜感激。
答案 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)
当你的代码执行时,函数从定义的那一刻起变得有形,但是它中的变量是短暂的,因为它们是仅在函数执行期间存储在内存中的值(即,当你调用时它完成之后就消失了。它实际上有点复杂,混合中有垃圾收集,但从简单的角度来看,这几乎就是发生的事情。