我只是在看hasattr方法,它接受一个对象作为参数。
来检验“一切都是对象”的理论。我创建了一个具有"name"属性的用户定义函数,但它返回False。我写的代码是:
def trial():
name = "james"
hasattr(trial, "name")这是否意味着函数不是对象?如果有人能帮我们解决这个问题我将不胜感激。
发布于 2017-12-25 02:18:58
函数是对象,但您创建的是一个带有局部变量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>,就像其他任何允许这样做的对象一样。
(并不是说这一定是达到预期结果的最佳方式,而只是演示它是可能的)
发布于 2017-12-25 02:19:59
Python中的函数确实是一个对象,但是函数中的局部变量不是它的属性。
尝试在代码的末尾添加以下内容:
>>> trial.__dir__()它将显示您定义的函数的所有属性-并且您正在访问function对象的属性。
如果需要,您甚至可以向function对象添加属性,但您必须小心不要覆盖现有属性。试试这个:
>>> trial.foo = 'bar'
>>> dir(trial) # Equivalent to trial.__dir__(). 'foo' is now in the list.
>>> hasattr(trial, 'foo')
>>> print(trial.foo)当你的代码正在执行时,函数从它被定义的那一刻起就变成了有形的东西,但其中的变量是短暂的,因为它们是仅在函数执行期间(即当你调用它时)存储在内存中的值,并在函数执行完成后消失。实际上要比这复杂一点,混合了垃圾收集,但从一个简单的角度来看,这几乎就是发生的事情。
https://stackoverflow.com/questions/47963008
复制相似问题