# import time
#
# def timmer(func): #func=最原始的index的内存地址
# def wrapper(*args,**kwargs):
# start=time.time()
# res=func(*args,**kwargs)
# stop=time.time()
# print(stop - start)
# return res
# return wrapper
#
# @timmer #index=timmer(index) #index=wrapper的内存地址
# def index():
# print('index function')
# time.sleep(1)
#
# index(1,2,3,) #wrapper(1,2,3) # 叠加多个装饰器
#1. 加载顺序: 自下而上
#2. 执行顺序 # import time
#
# def deco1(func1): #func1=wrapper2的内存地址
# # print('deco1运行')
# def wrapper1(*args,**kwargs):
# print('wrapper1')
# res=func1(*args,**kwargs)
# return res
# return wrapper1
#
# def deco2(func2): #func2=wrapper3的内存地址
# # print('deco2运行')
# def wrapper2(*args,**kwargs):
# print('wrapper2')
# res=func2(*args,**kwargs)
# return res
# return wrapper2
#
# def deco3(func3): #func3=最原始那个index的内存地址
# # print('deco3运行')
# def wrapper3(*args,**kwargs):
# print('wrapper3')
# res=func3(*args,**kwargs)
# return res
# return wrapper3
#
#
# # index=wrapper1
# @deco1 # index=deco1(wrapper2)
# @deco2 # wrapper2=deco2(wrapper3)
# @deco3 # wrapper3=deco3(最原始那个index的内存地址)
# def index():
# print('index function')
# time.sleep(1)
#
# index() #wrapper1() import time
current_user={'username':None} def timmer(func): #func=最原始的index的内存地址
def wrapper1(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs) #================>wrapper2
stop=time.time()
print(stop - start)
return res
return wrapper1 def auth(func):
def wrapper2(*args,**kwargs):
if current_user['username']:
res = func(*args, **kwargs)
return res
name=input('username>>: ').strip()
pwd=input('password>>: ').strip()
if name == 'egon' and pwd == '123':
current_user['username']=name
res=func(*args,**kwargs)
return res
else:
print('账号密码错误...')
return wrapper2 @timmer
@auth
def index():
print('index function')
time.sleep(1) index()
import time
current_user={'username':None} def outter(engine='file'):
def auth(func):
def wrapper2(*args,**kwargs):
# if current_user['username']:
# res = func(*args, **kwargs)
# return res
name=input('username>>: ').strip()
pwd=input('password>>: ').strip()
if engine == 'file':
print('基于文件的认证')
if name == 'egon' and pwd == '123':
current_user['username']=name
res=func(*args,**kwargs)
return res
else:
print('账号密码错误...')
elif engine == 'mysql':
print('基于mysql的认证')
elif engine == 'ldap':
print('基于ldap的认证')
else:
print("不合法的认证源")
return wrapper2
return auth @outter(engine='file') # 账号密码是来自于文件 index=aaa.txt(index) #index=wrapper2
def index():
print('index function')
time.sleep(1) @outter(engine='mysql') # 账号密码是来自于mysql # home=bbb(home) #home=wrapper2
def home(name):
print('home function',name)
time.sleep(1) index() #wrapper2()
home('egon') #wrapper2('egon')
 

Python记录11:叠加多个装饰器+有参装饰器的更多相关文章

  1. 【python基础】第19回 多层,有参装饰器 递归 二分法

    本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函 ...

  2. python基础语法8 叠加装饰器,有参装饰器,wraps补充,迭代器

    叠加装饰器: 叠加装饰器 - 每一个新的功能都应该写一个新的装饰器 - 否则会导致,代码冗余,结构不清晰,可扩展性差 在同一个被装饰对象中,添加多个装饰器,并执行. @装饰1 @装饰2 @装饰3 de ...

  3. python函数:装饰器、修正、语法糖、有参装饰器、global与nonlocal

    一.装饰器 二.装饰器修正1 三.装饰器修正2 四.装饰器的语法糖 五.有参.无参装饰器 六.global与nonlocal 一.装饰器 ''' 1 什么是装饰器 器=>工具 装饰=>指的 ...

  4. python函数之有参装饰器

    一.为什么要有有参装饰器? 来看之前的无参装饰器 # 无参装饰器 def outter(func): def wrapper(*args,**kwargs): start = time.time() ...

  5. python函数:叠加装饰器、迭代器、自定义迭代器、生成式

    一.叠加多个装饰器二.迭代器三.自定义迭代器四.xxx生成式 一.叠加多个装饰器 # 加载装饰器就是将原函数名偷梁换柱成了装饰器最内层那个wrapper函数 # 在加载完毕后,调用原函数其实就是在调用 ...

  6. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  7. python学习笔记-day4笔记 常用内置函数与装饰器

    1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any          ...

  8. python 有参装饰器与迭代器

    1.有参装饰器 模板: def auth(x): def deco(func): def timmer(*args,**kwargs ): res = func(*args,**kwargs ) re ...

  9. python 进阶篇 函数装饰器和类装饰器

    函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...

随机推荐

  1. QT工程文件的条件编译选择与额外的编译参数配置

    QTCreator打开.pro工程文件后,依据不同的构建套件创建项目组.在项目组中,点开构建步骤的“详情”,增加一个自己的宏定义,比如: DEFINES+=IMX_287 然后,我们在.pro文件中添 ...

  2. Web重温系列(一):利用寄宿于IIS的WCF序列化文件

    这两年一直在做WinForm,对于Web已经比较生疏了,其实之前做的也不是很多. 这两天做了一个小工具,功能很简单,就是想有个地方存放办公室同事的机器名和IP的信息,包括附加的用户名和更新时间.比较之 ...

  3. 树莓派apache2.4源码包安装

    1.安装apr-1.6.3.tar.gz apr-util-1.6.1.tar.bz2 httpd-2.4.34.tar.gz (源码包下载centos7的就行,树莓派版本官方debian) 2.问题 ...

  4. pyCharm最新激活码(2018激活码)

    首先输入新的License sever address 首先尝试处理方法是,针对过期会弹出激活框: 选择 Activate new license with License server (用lice ...

  5. Servlet开发 中使用 log4jdbc 记录 hibernate 的 SQL信息

    一.前言 使用log4jdbc在不改变原有代码的情况下,就可以收集执行的SQL文和JDBC执行情况. 平时开发使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺 ...

  6. [Cassandra] Mutation of <x> bytes is too large for the maxiumum size of <y>

    [Cassandra] Mutation of bytes is too large for the maxiumum size of Q: WARN [SharedPool-Worker-4] 20 ...

  7. [原]Jenkins(十六) jenkins再出发之jenkins+robot+blue ocean+svn

    jenkins version: 部署省略..(如有需要请查看本博客jenkins系列的文档) 新的jenkins需要先填写administratorpassword (如下图)找到下面红色的路径打开 ...

  8. pdf转html插件~~~pdf2htmlEX安装,配置及使用

    这是一个将pdf转化为html的服务,开源的. 此功能服务的代码在git上的地址为: https://github.com/coolwanglu/pdf2htmlEX/wiki 安装: 在ubuntu ...

  9. 【C++/实验三】类和对象

    1.定义一个矩形类,有长,宽两个属性,有成员函数计算矩形的面积. 在该矩形类中,我做了5个主要的测试. 构造函数带默认值参数,利用默认值参数计算矩形面积:rectangle(double x=2.0, ...

  10. ArcGIS AddIN 10.3项目与10.1项目的相互转换

    1. .sln修改 用记事本打开.sln文件,在最上面将10的I昂么修改为12的项目 将下图 修改为下图 反之亦然 2. .csproj项目修改 用记事本打开.csproj文件, vs 2010文件如 ...