装饰器 总结 2018.09.27

1. 什么是装饰器      器=》工具      装饰=>指的是为被装饰对象添加新功能

装饰器本身可以是任意可调用的对象=》函数      被装饰器本身也可以是任意可调用的对象=》函数

目标:写一个函数来为另外一个函数来添加一个新功能

2.为何要用装饰器      开放封闭原则:然间一旦上线就应该对修改封闭,对扩展开放          对修改封闭:              1.不能修改功能的源代码              2.也不能修改功能的调用方式

对扩展开放:              可以为原有功能添加新的功能

目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能

3.如何要用装饰器  1.无参装饰器的模板:        from functools import wraps        def outter(func):            @wraps(func)            def rapp(*args,**kwargs):            return rapp

2.def cert(cert_type=‘file‘):    def timeer(func):        def times(*args,**kwargs):            if login_status[‘user‘]:                res=func(*args, **kwargs)                return res            if cert_type==‘file‘:                    dic_11 = input(‘用户名>>:‘)                    dic_22 = input(‘密码>>:‘)                    if dic_11 in user["name"] and dic_22 in user["password"]:                        login_status[‘user‘]=dic_11                        res = func(*args, **kwargs)                        return res                    else:                        print(‘用户名或者密码错误‘)            return times    return timeer

# 装饰器的语法糖:在被装饰对象正上方单独一行写@装饰器的名字# 运行原理:# python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数#传给装饰器,最后将装饰器调用的结果赋值给原函数名

# import time## def timmer(func): #func=最原始那个home函数的内地址#     def wrapper(*args,**kwargs): #args=(‘egon‘,) kwargs={}#         start=time.time()#         res=func(*args,**kwargs) #最原始那个home函数的内地址(‘egon‘)#         stop=time.time()#         print(‘run time is %s‘ %(stop - start))#         return res#     return wrapper## @timmer #index=timmer(index)# def index():#     print(‘welcome to index page‘)#     time.sleep(3)## @timmer #home=timmer(home)# def home(name):#     print(‘welcome %s to home page‘ %name)#     time.sleep(2)#     return 123## index()# res=home(‘egon‘) # res=wrapper函数的内地址(‘egon‘)# print(res)##

import time

# 装饰器模板def outter(func):    def wrapper(*args,**kwargs):        #在调用函数前加功能        res=func(*args,**kwargs) #调用被装饰的\也就是最原始的那个函数        #在调用函数后加功能        return res    return wrapper

@outter #index=outter(index) #index=wrapperdef index():    print(‘welcome to index page‘)    time.sleep(3)

index()

叠加多个装饰器

# 解释@语法的时候是自下而上运行# 而执行装饰器内的那个wrapper函数时的是自上而下@timmer # index=timmer(wrapper2) #index=wrapper1@auth # index=auth(最原始的那个index的内存地址) #index=wrapper2def index():    print(‘welcome to index page‘)    time.sleep(3)

index() #wrapper1()

‘‘‘

# import time## def timmer(func):#     print(‘timmer‘)#     def wrapper1(*args,**kwargs):#         start=time.time()#         res=func(*args,**kwargs)  #res=wrapper2(*args,**kwargs)#         stop=time.time()#         print(‘run time is %s‘ %(stop - start))#         return res#     return wrapper1## def auth(func):#     print(‘auth‘)#     def wrapper2(*args,**kwargs):#         inp_user = input(‘please input your username: ‘).strip()#         inp_pwd = input(‘please input your password: ‘).strip()#         if inp_user == ‘egon‘ and inp_pwd == ‘123‘:#             print(‘login successfull‘)#             res=func(*args,**kwargs) # 调用最原始的那个/也就是被装饰的那个函数#             return res#         else:#             print(‘username or password error‘)#     return wrapper2### @auth   # index=auth(wrapper1) #index=wrapper2# @timmer #timmer(最原始的index)返回wrapper1# def index():#     print(‘welcome to index page‘)#     time.sleep(3)## index() #wrapper2()#

import time

def outter1(func1): #func1=wrapper2    print(‘outter1‘)    def wrapper1(*args,**kwargs):        print(‘wrapper1‘)        res1=func1(*args,**kwargs) #res1=wrapper2(*args,**kwargs)        return res1    return wrapper1

def outter2(func2): #func2=最原始的那个index的内存地址    print(‘outter2‘)    def wrapper2(*args,**kwargs):        print(‘wrapper2‘)        res2=func2(*args,**kwargs)        return res2    return wrapper2

@outter1 # index=outter1(wrapper2) #index=wrapper1@outter2 #outter2(最原始的那个index的内存地址) ===> wrapper2def index():    print(‘welcome to index page‘)    time.sleep(3)

index()  #wrapper1()

‘‘‘outter2outter1wrapper1wrapper2

有参函数

def login(engine=‘file‘): #engine=‘mysql‘    def auth(func): #func=最原始那个index的内存地址        def wrapper(*args,**kwargs):            if current_user[‘username‘]:                print(‘已经登录过了,无需再次登陆‘)                res=func(*args,**kwargs)                return res

if engine == ‘file‘:                inp_user = input(‘please input your username: ‘).strip()                inp_pwd = input(‘please input your password: ‘).strip()                if inp_user == ‘egon‘ and inp_pwd == ‘123‘:                    print(‘login successfull‘)                    current_user[‘username‘]=inp_user # 在登陆成功之后立刻记录登录状态                    res=func(*args,**kwargs) # res=最原始那个index的内存地址(*args,**kwargs)                    return res                else:                    print(‘username or password error‘)            elif engine == ‘mysql‘:                print(‘基于mysql的认证机制‘)            elif engine == ‘ldap‘:                print(‘基于ldap的认证机制‘)            else:                print(‘无法识别的认证源‘)        return wrapper    return auth

@login(‘file‘)  #@auth # index=auth(最原始那个index的内存地址) #index=wrapperdef index():    print(‘welcome to index page‘)    time.sleep(3)

@login(‘file‘)def home(name):    print(‘welcome %s to home page‘ %name)    time.sleep(2)    return 123

index() #wrapper()res=home(‘egon‘)print(res)

# 有参装饰器的模板def outter1(x,y,z):    def outter2(func):        def wrapper(*args,**kwargs):            res=func(*args,**kwargs)            return res        return wrapper    return outter2

补充:所有的数据类型的值自带布尔值,可以直接当作条件去用,只需要记住布尔值为假的那一些值即可(0,空,None)

原文地址:https://www.cnblogs.com/yanhui1995/p/9715262.html

时间: 2024-10-13 22:34:18

装饰器 总结 2018.09.27的相关文章

装饰器前奏(2017年8月20日 21:10:27)

实现装饰器知识储备 1.函数即"变量" 2.高阶函数 3.嵌套函数 # author :Yeison.Z import time def timmer(func): def warpper(*args,**kwargs): start_time=time.time() func() stop_time=time.time() print('the func run time is %s' %(stop_time-start_time)) return warpper @timmer d

python 第十二天2018.04.01 带参数的装饰器,,函数的有用信息

一.带参数的装饰器,函数的有用信息 def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func1() print(func1.__name__)#func1 print(func1.__doc__)#此函数的功能是完成的登陆的功能,return: 返回值是登陆成功与否 打印函数名 from functools import wraps def wrapper(f): @wraps(f) de

2018年9月28日函数part4多个装饰器和迭代器

一.多个装饰器 1.当一个被装饰的对象同时叠加多个装饰器时规则:(1) 装饰器的加载顺序是:自下而上(2)装饰器内wrapper函数的执行顺序是:自上而下 import time def timmer(func): #func=wrapper2的内存地址 def wrapper1(*args, **kwargs): print('===================================>wrapper1运行了') start=time.time() res = func(*args

python 双层装饰器、格式化、模块、迭代器和生成器

一.双层装饰器 一.双层装饰器 #!/usr/bin/env python # -*- coding:utf-8 -*- USER_INFO={} #USER_INFO['is_login'] = True #USER_INFO['user_type'] = 2 def check_login(func): def inner(*args ,**kwargs): if USER_INFO.get('is_login',None): ret = func(*args,**kwargs) retur

文成小盆友python-num5 -装饰器回顾,模块,字符串格式化

一.装饰器回顾与补充 单层装饰器: 如上篇文章所讲单层装饰器指一个函数用一个装饰器来装饰,即在函数执行前或者执行后用于添加相应的操作(如判断某个条件是否满足). 具体请见如下: 单层解释器 双层解释器 双层解释器在原理上相同,只是在执行时比单层复杂.见如下实例: 需求: 做一个简单的登录展示,有两个菜单即可一个菜单仅需要登录后就能查看,一个菜单不但需要登录,而且还得需要是超级管理员登录才能查看. 分析:1.可以写一个装饰器,在着一个装饰器中判断是否满足两个条件如果满足着执行函数体,但问题是还有一

python之路 内置函数,装饰器

一.内置函数 #绝对值 abs() #所有值都为真才为真 all() #只要有一个值为真就为真 any() #10进制转成二进制 bin() #10进制转成八进制 oct() #10进制转成十六进制 hex() #布尔值 bool() #字符转换成字节 bytes() #字节转换成字符 str() #对文件的操作 open() #基本流程 #打开文件 op_file=open("file name","rwb+") #操作文件 op_file.operation()

Python装饰器、迭代器、生成器、re正则表达式、字符串格式

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func): #定义装饰器 def inner

模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器

一.python模块(导入,内置,自定义,开源) 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. 2.模块的引入 在Python中用关键字

Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########