python的函数、方法、闭包的作用
和scala一样,python也区分函数和方法。
function和method:
(1)在python中,函数是一个独立、执行语句的一个整体,是可以直接调用的。而方法无法单独存在,需要依附于对象object而存在。也就是说,方法是写在class中的,调用method必须通过class的object才行。
(2)方法其实是一种特殊函数,写在class中,属于object的一种函数。
(3)“bound method”说明当前method是绑定到object上。
什么是闭包:
在一个function内部使用function外部的变量,或者在class的method使用当前method外部的变量,使得当前function和methos将外部变量包裹进来,形成一种封闭区域,这种特性简称闭包。(和scala的柯里化currying操作一致)
闭包的作用:
(1)实现操作的延迟计算。
(2)对相同操作共享部分变量。
(3)实现python的装饰器作用。(函数的返回值是一个函数,这个函数和输入函数一致)。
柯里化和反柯里化:柯里化将具有多个参数的一个函数拆分为包装的嵌套函数,第一个函数(包含第一个参数)的返回值仍是一个函数(其他参数)。反柯里化就是逆过程。
python语法层面的装饰器和设计模式中的装饰器:
(1)python语法层面的装饰器是一种python的特殊设计,使用@符号实现在不修改原函数的前提下增加新的功能。
(2)设计模式中的装饰器思想类似,在不修改当前object的前提下,给当前object新增新的功能。
鸭子类型Duck typing:
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由【继承自特定的类或实现特定的接口】,而是由"当前方法"【方法和属性的集合】"决定
鸭子测试
当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。
python是一种动态语言,有别于静态语言(Java、C++)中的继承和多态(继承时对父类的method覆盖写)性质,在静态语言中,使用一个变量或者object需要提前知晓类型,类型不一致则无法使用。而python作为动态语言则关心是方法和属性本身,而不关心当前object的类型。
将一个object传递给python函数时候,可以不关心object的类型,只需要object具有一个同名函数即可。
class FF1(object):
def run():
pass
class FF2(object):
def run():
pass
def UU(ff):
ff.run()
对于UU函数,不论对象ff何种类型,只需要ff包含run方法即可。这种编程思想即是鸭子类型。
在鸭子类型的编程中,程序的正确性依据:【依赖文档、清晰的代码和测试】,而不是function或者method的参数类型。
未完待续~