当前位置:
首页 > Python基础教程 >
-
python基础教程之python 之 函数 装饰器
5.8 装饰器
1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能原则如下: 1、不修改源代码 2、不修改调用方式 目的: 在遵循1和2原则的基础上扩展新功能
装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象
装饰器 ===》函数 被装饰的对象 ===》函数
5.81 无参装饰器举例
import time def index(): time.sleep(3) print('welcome to index page') def outter(func): #func=最原始的index def wrapper(): start_time=time.time() func() stop_time=time.time() print(stop_time-start_time) return wrapper index=outter(index) # 新的index=wrapper index() #wrapper() welcome to index page 3.0000429153442383
5.82 无参装饰器升级
import time def index(): time.sleep(1) print('welcome to index page') return 122 def home(name): time.sleep(2) print('welcome %s to home page' %name) #==============装饰器 def timmer(func): #func=最原始的index def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) #调用最原始的index stop_time=time.time() print(stop_time-start_time) return res return wrapper index=timmer(index) # 新的index=wrapper home=timmer(home) #新的home=wrapper # ========================================== res=index() #res=wrapper() print(res) res=home(name='egon') #res=wrapper(name='egon') print(res)
5.83 无参装饰器模板:
def index(): pass #==============装饰器 def outer(func): def inner(*args,**kwargs): res=func(*args,**kwargs) return res return inner index=outer(index) # ========================================== res=index() print(res)
使用:在被装饰对象正上方单独一行,@无参装饰器名
@无参装饰器名 def foo(): pass
5.84 装饰器语法糖
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(stop_time-start_time) return res return wrapper @timmer #index=timmer(index) def index(): time.sleep(1) print('welcome to index page') return 122 @timmer # home=timmer(home) def home(name): time.sleep(2) print('welcome %s to home page' %name) index() home('egon')
5.85 叠加装饰器
import time current_user={ 'username':None, } def auth(func): # func=index def wrapper(*args,**kwargs): if current_user['username']: print('已经登陆过了') res=func(*args,**kwargs) return res uname=input('用户名>>: ').strip() pwd=input('密码>>: ').strip() if uname == 'egon' and pwd == '123': print('登陆成功') current_user['username']=uname res=func(*args,**kwargs) return res else: print('用户名或密码错误') return wrapper def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(stop_time-start_time) return res return wrapper @timmer # timmer 统计的是auth+index的执行时间 @auth def index(): time.sleep(1) print('welcome to index page') return 122 index()
5.86 有参装饰器
import time current_user={ 'username':None } def auth(engine): # engine='file' #添加一层函数传engine值 def auth2(func): # func=index def wrapper(*args,**kwargs): if engine == 'file': if current_user['username']: print('已经登陆过了') res=func(*args,**kwargs) return res uname=input('用户名>>: ').strip() pwd=input('密码>>: ').strip() if uname == 'egon' and pwd == '123': print('登陆成功') current_user['username']=uname res=func(*args,**kwargs) return res else: print('用户名或密码错误') elif engine == 'mysql': print('基于MyQL的认证') elif engine == 'ldap': print('基于LDAP的认证') return wrapper return auth2 #auth_src=auth('ldap') #@auth_src @auth('ldap') # @auth2 #index=auth2(index) #index=wrapper def index(): time.sleep(1) print('welcome to index page') return 122 index() # wrapper()
5.87 有参装饰器模板
def outter2(x,y,z): def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper return outter @outer2(1,2,3) # ========================================== def index(): pass res=index() print(res) 使用:在被装饰对象正上方单独一行,@有参装饰器名(1,2,3) @有参装饰器名(1,2,3) def foo(): pass
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式