zoukankan      html  css  js  c++  java
  • 装饰器

    
    
    本质是函数,装饰其他函数,就是为其他函数添加附加功能
     

    原则:

    1.不能修改被装饰的函数的源代码
    2. 不能修改被装饰的函数的调用方式
     

    实现装饰器知识储备:

    1.函数即“变量”
    2.高阶函数
       a.把一个函数名当做一个实参传给另外一个函数(不修改被装饰函数源代码情况下为其添加新功能)
       b.返回值中包含函数名(不修改函数的调用方式)
    3.嵌套函数 
     
    举个例子什么叫高阶函数:
    描述a
    def bar():
    print("in the bar")

    def test(func):
    print("in the foo")
    func()
    print("end")

    test(bar)
     
    描述b
    # -*- coding:utf-8 -*- 
    # Author:Brownyangyang
    def bar():
    print("in the bar")

    def test(func):
    print(func)
    return func

    #把return的返回值传给bar
    bar=test(bar) ##这里传的是bar不能是bar(),bar是函数,bar()就是bar函数的运行结果
    bar()


    举个例子什么叫嵌套函数:
    # -*- coding:utf-8 -*- 
    # Author:Brownyangyang
    def foo():
    print("in the foo")

    def bar():
    print("in the bar")

    bar()

    foo()

    举个装饰器的例子:
    # -*- coding:utf-8 -*- 
    # Author:Brownyangyang
    import time
    def timer(func):  ##timer(test1)  func=test1
        def deco():
            start_time = time.time()
            func()   ##执行test1
            stop_time = time.time()
            print("the func run time")
        return deco
    
    def test1():
        time.sleep(3)
        print('in the test1')
    
    print(timer(test1))  ##打印deco的内存地址
    test1 = timer(test1) ##把deco内存地址给test1
    test1()   ##现在执行test1就是执行deco,这里的test1现在已经不是原来定义的test1了,原来的test1是func

    上面等同于:

    # -*- coding:utf-8 -*-
    # Author:Brownyangyang
    import time
    def timer(func):  ##timer(test1)  func=test1
        def deco():
            start_time = time.time()
            func()   ##执行test1
            stop_time = time.time()
            print("the func run time")
        return deco
    
    @timer
    def test1():
        time.sleep(3)
        print('in the test1')
    
    print(timer(test1))  ##打印deco的内存地址
    test1()   ##现在执行test1就是执行deco,这里的test1现在已经不是原来定义的test1了,原来的test1是func

    如果test1()要传参数呢

    # -*- coding:utf-8 -*-
    # Author:Brownyangyang
    import time
    def timer(func):  ##timer(test1)  func=test1
        def deco(*args,**kwargs):
            start_time = time.time()
            func(*args,**kwargs)   ##执行test1
            stop_time = time.time()
            print("the func run time")
        return deco
    
    @timer
    def test1(name,age):
        time.sleep(3)
        print('in the test1',name,age)
    
    print(timer(test1))  ##打印deco的内存地址
    test1("liyang",22)   ##现在执行test1就是执行deco,这里的test1现在已经不是原来定义的test1了,原来的test1是func

    如果我想要test1参数有返回值呢

    # -*- coding:utf-8 -*-
    # Author:Brownyangyang
    import time
    def timer(func):  ##timer(test1)  func=test1
        def deco(*args,**kwargs):
            start_time = time.time()
            res = func(*args,**kwargs)   ##执行test1
            stop_time = time.time()
            print("the func run time")
            return res
        return deco
    
    @timer
    def test1(name,age):
        time.sleep(3)
        print('in the test1',name,age)
        return "from test1"
    
    print(timer(test1))  ##打印deco的内存地址
    test1("liyang",22)
    print(test1("liyang",22))
    解释下:在执行test1的时候,res = func(*args,**kwargs)的意思是执行了func函数并且把返回值"from test1" 赋值给了res


    # -*- coding:utf-8 -*-
    # Author:Brownyangyang

    user_status=False
    def login(func):
    def inner(*args,**kwargs):

    _username="liyang"
    _password="123456"
    global user_status

    if user_status==False:
    username=input("请输入用户名:")
    password=input("请输入密码:")
    if username==_username and password==_password:
    print("验证通过")
    user_status=True
    else:
    print("用户名或者密码错误")

    if user_status==True:
    func(*args,**kwargs)
    return inner

    @login
    def america(lanmu):
    #login()
    print("hello,I am amrica",lanmu)

    america("AV")
  • 相关阅读:
    转:浅谈深度学习(Deep Learning)的基本思想和方法
    随记:我们需要怎样的数学教育?
    转 :hlda文献学习笔记
    转:关于Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码
    推荐算法相关总结表(包括DM)
    转 自己动手写推荐系统
    求熵 python 代码
    特征值与特征向量
    转: 谱聚类
    链接数据库
  • 原文地址:https://www.cnblogs.com/brownyangyang/p/8577379.html
Copyright © 2011-2022 走看看