博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 装饰器
阅读量:6432 次
发布时间:2019-06-23

本文共 2242 字,大约阅读时间需要 7 分钟。

定义:

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,实现了软件开发中的一个原则“开放-封闭”原则。

封闭:已实现的功能代码块不应该被修改

开放:对现有功能的扩展开放

 

1. 本来有一个函数为test,我想在这基础上获取test运行的时间,就可以通过装饰器来实现

def test():    time.sleep(2)    print("in the test")    首先创建一个高阶函数,里面再定义一个函数def timmer(func):    def warpper(*args, **kwargs):        start_time = time.time()        func(*args, **kwargs)        stop_time = time.time()        print("The func run time is %s" % (stop_time - start_time))    return warpper## test = timmer(test) 不会触发函数的执行,只返回函数的函数名warpper## timmer(test)返回的是warpper的内存地址,如果想要在test函数里面传入参数,可以在warpper函数中定义参数    test = timmer(test)     ## 这行代码可以简化为在test函数前面@timmer        ## 调用函数warpper(),这样就实现了调用方式不变,还能添加额外的功能test()

2. 给网站模块加入自认证

说明:首先网站有三个模块index、home、bbs,index模块不需要认证,home模块类型为local的需要加入自认证,bbs模块类型为ldap需要打印内容,因为多了一层模块下面还有各种类型,所以装饰器里面还需加入一层函数。

def auth(auth_type):    print("auth func: ", auth_type)    def outer_wrapper(func):        def warpper(*args, **kwargs):            print("wrapper func args: ", *args, **kwargs)            if auth_type == "local":                username = input("Username: ").strip()                password = input("Password: ").strip()                if user == username and passwd == password:                    print("\033[32;1mUser has passwd authentication\033[0m")                    res = func(*args, **kwargs)                    print("--after authentication")                    return res                else:                    exit("\033[31;1mInvalid username or password\033[0m")            elif auth_type == "ldap":                print("No need.")        return warpper    return outer_wrapperdef index():    print("Welcome to index page")@auth(auth_type="local")def home(name):    print("%s, welcome to home page" % name)    return "from home"@auth(auth_type="ldap")def bbs():    print("Welcome to bbs page")if __name__ == "__main__":    user, passwd = "wangzai", "111111"    name = "doubi"    # index()    print(home(name))  # 相当于 # outer_wrapper = auth("local")     ## 返回outer_wrapper函数名                               # home = outer_wrapper(home)        ## 返回wrapper函数名                               # print(home(name))                 ## 调用warpper函数

 

转载于:https://www.cnblogs.com/654wangzai321/p/8150897.html

你可能感兴趣的文章
java读取properties文件的几种方法
查看>>
Android初步-HelloWorld
查看>>
记录一下家里双路由实现wifi漫游功能
查看>>
统计字母个数
查看>>
论思维变通的重要性!--input输入框禁止编辑,且 右键弹出窗口复制
查看>>
【ocp-12c】最新Oracle OCP-071考试题库(43题)
查看>>
Vuex
查看>>
iOS深拷贝浅拷贝
查看>>
spring coud feign
查看>>
NPOI List数据源 导出excel
查看>>
07抽象类特点
查看>>
什么事数据对象以及属性分为什么类型?
查看>>
图论精炼500题
查看>>
递归,动态规划,找最短路径,Help Jimmy
查看>>
poj 1006 生理周期
查看>>
Leetcode题目:House Robber III
查看>>
生物技术制药课程学生论文调研报告集
查看>>
LNK1104 无法打开文件 exe
查看>>
二叉树中和为某一值的路径
查看>>
【ZZ】一张图清晰追溯数据库的发展历程(1962-2016年)
查看>>