Python入门课程NO60课 函数装饰器
装饰器是一种软件设计模式,可以对已有的对象进行功能上的扩展,而无需改变其结构。如何使用装饰器来进行功能上的扩展?我们得先学习Python中的闭包函数。
闭包函数:简单地理解,就是函数中定义的一个内部函数,该内部函数可以访问外部函数作用域中的参数,变量。
使用闭包进行功能扩展(即:装饰器):
假如我们有个项目在初期是允许任何访问者查看的,代码如下:
随着项目的不断迭代,我们需要方可登陆后才能浏览此页面,那么我们就有两种选择,一种是直接修改welcome函数,另一种就是使用函数装饰器,前面已经讲过,函数装饰器是对已有对象进行功能上的扩展,而不改变其结构。很明显选择装饰器更为合适。我们来做一些修改。
装饰器语法糖:
在上面的代码片段中,不够直观和自然,因为需要将被装饰的函数作为参数传递给装饰器,还需要再执行返回的闭包函数,那么如何才能更优雅的使用呢?
Python中提供了语法糖,在函数头前面加上一行@decortator的修饰符,可以对当前函数进行装饰,decortator表示具体的装饰器名。在上文的代码中,login函数就是一种装饰器,现在使用@符号来对welcome函数进行装饰。以上程序可以修改为:
对welcome函数使用@login进行装饰以后,Python会自动将wecome函数作为参数传递给login函数, 并执行返回的闭包函数,这是Python装饰器的核心逻辑所在。装饰器中的闭包函数参数须与被装饰对象的参数一致,在不确定被装饰对象的参数时,可以使用可变参数:*args, **kwargs。 使用可变参数的装饰器结构:
装饰器也是用来进行功能上的扩展。在面向对象中,装饰器是一种软件设计模式,可以对已有的对象进行功能上的扩展,而无需改变其结构。 闭包函数,简单地理解,就是函数中定义的一个内部函数,该内部函数可以访问外部函数作用域中的参数,变量。
- 上一篇
Python入门课程NO59课 匿名函数lambda表达式
匿名函数,也就是没有函数名的函数。在Python中,通过lambda表达式来定义匿名函数。与之对应的是具名函数。具名函数即为有函数名的函数。通过def来定义的函数,就叫具名函数。也就是我们之前讲解的函数。lambda表达式的语法结构:lambda parameters: expression举例说明:由于
- 下一篇
Python入门课程NO61课 递归函数
所谓的递归函数,是指自己调用自己的函数。这里的调用不一定是直接调用,也可以是间接地调用。举例说明:但这样自身不断的调用自身会陷入死循环当中,无法结束,因此python会抛出一个错误,指示该递归函数已超出了最大递归深度。因此递归函数必须能够正常终止在设计递归函数时