Python hasattr检查函数是否具有属性
我刚才在看Python hasattr检查函数是否具有属性,python,oop,Python,Oop,我刚才在看hasattr方法,它接受一个对象作为参数 检查“一切都是对象”理论。我创建了一个带有属性“name”的用户定义函数,但它返回False。我写的代码是: def trial(): name = "james" hasattr(trial, "name") 这是否意味着函数不是对象?如果有人能帮我们解决这个问题,我将不胜感激。函数是对象,但您创建的是一个带有局部变量名称的函数,它不是该函数的属性。让我们检查一下函数代码: >>> trial.__code__
hasattr
方法,它接受一个对象作为参数
检查“一切都是对象”理论。我创建了一个带有属性“name”
的用户定义函数,但它返回False
。我写的代码是:
def trial():
name = "james"
hasattr(trial, "name")
这是否意味着函数不是对象?如果有人能帮我们解决这个问题,我将不胜感激。函数是对象,但您创建的是一个带有局部变量名称的函数,它不是该函数的属性。让我们检查一下函数代码:
>>> trial.__code__.co_varnames
('name',)
如您所见,name
确实是函数的局部变量
但是,仍然可以在函数上定义属性:
>>> def trial():
... name = "james"
...
>>> trial.foo = 'bar'
>>> hasattr(trial, 'foo')
True
>>> getattr(trial, 'foo')
'bar'
为函数指定属性的方法是说=代码>,就像其他允许它的对象一样
(并不是说这一定是实现所需结果的最佳方式,只是作为一个演示,它是可能的)函数是对象,但您创建的是一个带有局部变量名称的函数,它不是该函数的属性。让我们检查一下函数代码:
>>> trial.__code__.co_varnames
('name',)
如您所见,name
确实是函数的局部变量
但是,仍然可以在函数上定义属性:
>>> def trial():
... name = "james"
...
>>> trial.foo = 'bar'
>>> hasattr(trial, 'foo')
True
>>> getattr(trial, 'foo')
'bar'
为函数指定属性的方法是说=代码>,就像其他允许它的对象一样
(并不是说这一定是实现预期结果的最佳方式,只是作为一个演示,它是可能的)Python中的函数确实是一个对象,但函数中的局部变量不是它的属性
尝试在代码末尾添加以下内容:
>>> trial.__dir__()
它将显示您定义的函数的所有属性,并且您正在访问函数对象的属性
如果需要,甚至可以向函数对象添加属性,不过必须小心不要覆盖现有属性。试试这个:
>>> trial.foo = 'bar'
>>> dir(trial) # Equivalent to trial.__dir__(). 'foo' is now in the list.
>>> hasattr(trial, 'foo')
>>> print(trial.foo)
当您的代码正在执行时,函数从定义的那一刻起就变得有形,但其中的变量是短暂的,因为它们是仅在函数执行期间(即调用函数时)存储在内存中的值,并且在函数完成后消失。实际上,它比这复杂一点,混合使用垃圾收集,但从简单的角度来看,这几乎就是实际情况。Python中的函数确实是一个对象,但函数中的局部变量不是它的属性
尝试在代码末尾添加以下内容:
>>> trial.__dir__()
它将显示您定义的函数的所有属性,并且您正在访问函数对象的属性
如果需要,甚至可以向函数对象添加属性,不过必须小心不要覆盖现有属性。试试这个:
>>> trial.foo = 'bar'
>>> dir(trial) # Equivalent to trial.__dir__(). 'foo' is now in the list.
>>> hasattr(trial, 'foo')
>>> print(trial.foo)
当您的代码正在执行时,函数从定义的那一刻起就变得有形,但其中的变量是短暂的,因为它们是仅在函数执行期间(即调用函数时)存储在内存中的值,并且在函数完成后消失。实际上,它比这个复杂一点,混合中有垃圾收集,但从简单的角度来看,情况差不多就是这样。函数是一个对象,但name
不是一个属性name
是在运行trial()
函数时创建的变量。函数是对象,确实有属性,但局部变量不是。例如,如果在函数定义和检查之间添加trial.name='James'
,您将看到它是真的。您没有具有属性name
的函数。您能举一个函数具有属性的示例吗,我的印象是属性只是对象的属性。那么为什么变量不是属性呢。@SahibSingh变量是处理函数中定义的过程而产生的名称。函数是一个对象,但name
不是属性name
是在运行trial()
函数时创建的变量。函数是对象,确实有属性,但局部变量不是。例如,如果在函数定义和检查之间添加trial.name='James'
,您将看到它是真的。您没有具有属性name
的函数。您能举一个函数具有属性的示例吗,我的印象是属性只是对象的属性。那么为什么变量不是属性呢。@SahibSingh变量是处理函数中定义的过程所产生的名称。