python中,一切皆对象。
在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。
函数身为一个对象,拥有对象模型的三个通用属性:id、类型、和值。
把函数内部的变量看成函数的一个属性,使用赋值语句将一个变量添加为该函数对象的属性。
注意:只有函数被调用(函数内部的赋值语句被执行过)后,我们才可以用对象点的方式访问函数对象的属性
例如在下面的代码最后一行,编译器在
"""
*Copyright (c) 2018 Young Fan.All Right Reserved.
*Author: Young Fan
*Date: 2019.06.11
*Description:
"""
def funX(x):
m_x = x
funX.m_x = m_x # 把函数内部的变量看成函数的一个属性,使用赋值语句将一个变量添加为该函数对象的属性。
print(funX)
funX(3) # 只有函数被调用(函数内部的赋值语句被执行过)后,我们才可以用对象点的方式访问函数对象的属性
print("funX.m_x = ", funX.m_x) # m_x被编译器置灰了,说找不到该属性,因为函数还没有调用(函数内部的赋值语句还执行过,所以还没有这个属性)
代码执行的结果:
难怪说python写东西简洁,函数都是对象了,这样的话下次调用就可以查看上次调用的结果。
比如:
# 下次调用就可以查看上次调用的结果。
# 下面实现的功能:如果一个函数被执行过一次后(属性被赋值),后面再执行就用原来的属性值
# 和单例思想有点像
def funY(y):
if hasattr(funY, "m_y"): # hasattr:意思为has a attribute? 就是验证某对象是否有某个属性
return funY.m_y # 返回保存的属性值
m_y = y
funY.m_y = m_y # 将m_y设为函数对象的属性,保存起来
return m_y
funY(8)
print(funY.m_y)
funY(10)
print(funY.m_y)
结果:都是8
详细请参考:
https://www.cnblogs.com/smallmars/p/6936871.html
python函数内部变量通过函数属性实现全局变量