装饰器

闭包

函数内部作用域定义的变量和函数,只能在函数内部使用(外部无法直接访问和修改)

函数外部要使用局部作用域内的数据,只能通过return返回出去

闭包函数 = 函数 + 保存引用数据的封闭作用域`

闭包的特征:

函数中嵌套一个函数

外层函数rertun返回 内层函数

内层函数有引用 **外部作用域** 的非全局变量

 

 

装饰器:
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:
1、不能修改被装饰函数的源代码
2、不能修改被装饰的函数的调用方式

实现装饰器知识储备
1、函数既变量
2、高阶函数
把函数名当作一个实参传递给另一个函数
返回值中包含函数名
3、嵌套函数
高阶函数+嵌套函数=装饰器
"""

 

基础装饰器:

装饰器

 

 

装饰器

 

 

 func_demo(2,3)

输出:

-----装饰器的扩展功能--1----

a除B的结果为: 0.6666666666666666

 

装饰器的副作用:

print(func_demo.__name__)  打印函数的名称

print(func_demo.__doc__)    打印函数的注释说明

在函数func_demo使用装饰器func后,打印func_demo的函数名,和函数说明,会打印出wrapper的函数名和函数说明

为了消除这一副作用,需要引入模块 :from functools import wraps 

装饰器

 

 

 装饰器装饰类

装饰器

 

 

 注意:

  在装饰类的时候在调用原来类的对象的时候,一定要用一个变量接受,然后对变量进行返回,不加return类就不能创建对象

 

可以传参数的装饰器

点击查看代码
def decorator(name):
    """最外层的参数是装饰器的参数"""
    def wrapper1(func):
        """第二次定义的参数,接收被装饰的函数"""
        def wrapper2(*args, **kwargs):
            print("-----装饰器的扩展功能代码111")
            print("装饰器传入的参数name:", name)
            # 执行被装饰的函数
            res = func(*args, **kwargs)
            print("-----装饰器的扩展功能代码222")
            return res
        return wrapper2
    return wrapper1


@decorator('musen')  # work = decorator('musen')(work)   decorator('musen')等于wrapper1
def work():
    print('--------------work------------------')

缓存装饰器lru_cache:

对同一个函数相同的入参执行的结果进行缓存,通常用于提升递归函数的效率

例:用一个函数得,传一个int正整数,得到斐波那契数列的第几位数

装饰器

 

 输出:34

上一篇:day6 - 日志和作业


下一篇:『无为则无心』Python面向对象 — 48、添加和获取对象属性