不修改函数代码时,通过闭包和装饰器,能够改变函数的功能。
闭包
每个闭包调用时,是创建了一个新的内存空间的。
给独有的数据。
一个例子:计算 一条 线上的y值,k,b,x都可变。
用面向对象的方法会 浪费资源。会继承很多 object 的内容,比较沉重。
闭包是,函数里面嵌套有函数,往往内部函数会用到外部函数的参数。
用闭包的方式,占用内存资源少。
匿名函数的介绍: lambda
https://blog.csdn.net/weixin_43790276/article/details/90730797
可以加 nonlocal 来使得内部的函数 可以使用 外部函数的变量。
装饰器
函数名 也是 变量名。
利用了闭包来实现装饰器。
装饰器的实现原理。 语法糖:@set_func 等价于 test1 = set_func() ;也就是说指向了增加了内容的代码块。
在遇到 @set_func ,就会执行,来装饰好这个函数。
对于有 定长 参数的情况:
用装饰器装饰多个函数。
对不定长 参数 的函数 进行 装饰:
在闭包里 用 *args 和 **kwargs 来接收参数。
对 有 返回值的函数 使用 装饰器。
经过以上的逐步 演进,上面这一个 就是 通用装饰器。
多个装饰器 装饰 同一个函数:
装饰的顺序是 从 靠近函数的开始往上一次装饰,在执行的时候,会按从上往下装饰的顺序开始执行。
用类对函数进行装饰: 还可以扩展,类名后加调用等可以先不了解。
装饰器的参数:
在加一层来接收装饰器的参数,在调用时@set_level(10) 时,会返回一装饰器,再用这个装饰器装饰函数。
小例子:
用装饰器来完成 路由映射