知乎问题:
像这个图片里面显示的,self.prediction首先声明了下然后下面给出了定义,然后optimize又调用这个函数但是没有用self.prediction()这样的方式而是像用变量一样直接用self.prediction,,像请教一下这是什么操作?
知乎回答:
python中变量和函数都不需要提前声明,函数直接定义就可以了。这里提前声明不知道是写的人习惯了其它语言,还是为了可读性。
在python中一切皆对象,函数也不例外。因此可以将函数绑定到变量上或者传递,使用时后面加上()就可以调用。
在下面的方法中self.prediction后面没有加(),但是又把它和一个浮点数相加,说明此时它的值是一个数字。如果是平常的写法,函数对象不可能与数字相加。
我推测关键处在prediction定义时的装饰器,它可能有类似于property装饰器的作用,将self.prediction转化成了一个属性,这样不需要加()也可以返回值了。
答者补充:
因为Python语言的动态性,在写代码时,代码检查工具可能认为self没有这样的属性,这时你预先声明了,它就不会报错。
作者:松直
python修饰器
要理解python的装饰器,我们首先必须明白在Python中函数也是被视为对象。函数既然作为一个对象,因此:
1. 其可以被赋给其他变量
2. 其可以被定义在另外一个函数内
3. 作为参数传递给函数
其实它可被视为封装器。也就是说,它能够让你在装饰前后执行代码而无须改变函数本身内容。