装饰器decorator总结(函数即是变量、高阶函数、嵌套函数、参数组)

装饰器

  1. decorator的本质他就是函数
  2. 原则:--对于被装饰的函数他不发生任何变化,他是透明的。
    • 不能修改被装饰的函数的源代码
    • 不能修改被装饰的函数的调用方式
  3. 函数就是"变量":
    • 普通变量。先定义后使用:如x=1,先定义变量x和再调用变量;函数也如此,先定义函数在调用函数;
python 复制代码
#第一步:定义
def fibo(x):
    if x==0:
        return 1
    elif x==1:
        return 1
    else:
        return fibo(x-1) + fibo(x-2)
#第二步:调用
print(fibo(10))
  • 存储也是一样,函数名以及函数体存储:普通变量x为名牌号,1为值存储在内存中,函数则函数名为名牌号,函数体存储在内存中
  • 匿名函数:特殊的匿名函数没有函数名,用完即回收:lambda x :print(x)
  1. 高阶函数;如def test(x,y,func)
    • 把一个函数当做参数传参给另外一个函数
    • 返回值包含函数名
python 复制代码
def sum(a,b,c):
    return a+b+c

#sum是函数名,为传参
def fun(a,b,c,sum):
    print("count:")
    return sum(a,b,c)  #返回值sum函数名

print(fun(1, 2, 3, sum))
  1. 函数嵌套:定义函数时函数中包含另外一个函数。
python 复制代码
def foo():
    print('in the foo')
    def bar(): #函数foo中的函数
        print('in the bar')
    bar()

foo()
  1. 装饰器=高阶函数+嵌套函数
python 复制代码
def decorator(func):  #func_test01传值给func 高阶函数
    def wrapper(*args,**kwargs):  #嵌套函数 参数组
        start_time = time.time()
        func(*args,**kwargs)  #调用func_test01 参数组
        stop_time = time.time()
        print("the fun runtime is {}".format(stop_time - start_time))
    return wrapper  #返回这个函数的内存地址

@decorator   #func_test01=decorator(func_testo1) 
def fun_test01():  #原函数的源代码不变
    time.sleep(1)
    print('in fun_test01')

fun_test01() #函数调用方式不变
  1. 带参数组的装饰器:三层嵌套
python 复制代码
import time
user_name="agan"
password="123"

def auth(auth_type):
    def outer_wrapper(func):
        print("you auth_type is {}".format(auth_type))
        def wrapper(*args, **kwargs):
            print('wrapper func args:',*args,**kwargs)
            if auth_type == 'local':
                uname = input("Please input your username: ").strip() #去掉字符串开头和结尾的空白字符
                psd = input("Please input your password: ").strip()
                if uname == user_name and psd == password:
                    print("you have authenticated!")
                    res = func(*args, **kwargs)  # 调用func
                    return res
                else:
                    print("wrong username or password!")
            else:
                print("wrong auth type!")
        return wrapper
    return outer_wrapper


def index():
    print("welcome to index page")

@auth(auth_type="local") # home = outer_wrapper
def home():
    print("welcome to home page")

index()
home()
相关推荐
零基础1231 小时前
LLM Agent 驱动的物模型构建:从设备手册到边缘接入的自动化实践
运维·人工智能·经验分享·python·自动化
zyj8890911 小时前
工厂标识系统设计规范?工厂标识牌有哪些类型?
python·设计规范
weixin_440730501 小时前
迭代器Iterator(列表生成器、可迭代的如何生成迭代器)
开发语言·python
weixin_440730502 小时前
内置函数、json文本、pickle二进制
开发语言·python·json
计算机毕业编程指导师2 小时前
Python大数据毕设:基于Hadoop的病毒式社交媒体趋势和参与度分析系统怎么做 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·毕业设计·课程设计·社交媒体
计算机毕业编程指导师2 小时前
【计算机毕设选题推荐】基于Spark与Hadoop的AI就业收入区域差异分析系统 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·数据分析·spark·毕业设计·课程设计·ai就业收入
小猴子爱上树2 小时前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
lzqrzpt3 小时前
临沂LED驱动电源工程选型标准与工艺对比解析
python·单片机·嵌入式硬件·物联网