PYTHON装饰器用法及演变
'''
开放封闭原则:
软件一旦上线之后就应该满足开放封闭原则
具体就是指对修改是封闭的,对扩展是开放的
装饰器:
什么是装饰器:装饰就是修饰,器指的是工具
装饰器本省可以是任意可调用的对象
被装饰的对象也可以是任意可以被调用的对象 装饰器====》可以是一个函数
被装饰对象====》也可以是一个函数
装饰器就是用来为被装饰对象修改添加新功能的一种工具
必须遵循两个原则:
1,不能修改被装饰对象的源代码
2,不能修改被装饰对象的调用方式 ###简单版本的装饰器:这种简单的装饰器只适用于没有参数没有返回值的情况
'''
import time
'''
def indes():
start_time = time.time()
time.sleep(1)
print('welcome to index')
end_time = time.time()
print('runtime is %s' %(end_time-start_time))
#
# # indes()
# def wrapper(func):
# start_time = time.time()
# func()
# end_time = time.time()
# run_time = end_time-start_time
# print(run_time)
# # wrapper(indes)
# def home():
# pass
# # wrapper(home)
#
def outer(func):
# func = indes
def wrapper():
start_time = time.time()
func()
end_time = time.time()
run_time = end_time-start_time
print(run_time)
return wrapper
indes = outer(indes)####f = wrapper
res = indes()
print(res)
'''
# print('='*100)
# def outer():
# def wrapper():
# start_time = time.time()
# return 123
# print("hello world")
# end_time = time.time()
# print('运行时间是%s' %(end_time - start_time))
# return wrapper
# res = outer()
# print(res())
###装饰器进阶版:
'''
import time
def home(name):
time.sleep(2)
print("welcome to home page")
return 1234 def timmer(func):
def inner(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print('运行时间是%s' %(end_time - start_time))
return res
return inner home = timmer(home)
home('egon')
'''
'''
装饰器语法糖:
在被装饰对象正上方单独一行写:
@装饰器的名字 意思也就是: 被装饰对象 = 装饰器的名字(被装饰对象)
注意:新定义的装饰器函数必须放在要装饰的函数的上方,也就是给要装饰的函数带个帽子 最终的版本是:
'''
'''
import time def timmer(func):####装饰器函数
def inner(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print('运行时间是%s' %(end_time - start_time))
return res
return inner
@timmer
###被装饰的对象
def home(name):
time.sleep(2)
print("welcome to home page")
return 1234 # home = timmer(home)
home('egon')
'''
'''
import time def outer(func):
def wrapper(*args,**kwargs):####这里的参数情况要和被装饰的对象一致
user_name = input('please input user name =====>')
pwd = input('please input pass word======>')
if user_name =='egon' and pwd == '123':
res = func(*args,**kwargs)
return res
return wrapper
@outer
def index():
time.sleep(1)
print('welcome to index page ')
return 1234 def home(name):
time.sleep(2)
print('welcome %s to home page ' %name ) index()
'''
####有参装饰器
##有带参数的装饰器,这个是最高难度的,一般也只需要像这样套三层。
import time
def anth(engine = 'file'):###默认参数设置为file
def outer(func):
def wrapper(*args,**kwargs):####这里的参数情况要和被装饰的对象一致
user_name = input('please input user name =====>')
pwd = input('please input pass word======>')
if engine == 'file':
if user_name =='egon' and pwd == '123':
res = func(*args,**kwargs)
return res
elif engine =='mysql':
print("基于mysql的认证")
elif engine == 'ldap':
print('基于lasp的认证') return wrapper
return outer
ot = anth(engine = 'mysql')
@ot
def index():
time.sleep(1)
print('welcome to index page ')
return 1234 def home(name):
time.sleep(2)
print('welcome %s to home page ' %name ) index()
PYTHON装饰器用法及演变的更多相关文章
- Python装饰器用法
在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...
- python装饰器@用法
这个是我见过比较好的讲解链接: [廖雪峰的官方网站 - 装饰器]
- Python装饰器的另类用法
之前有比较系统介绍过Python的装饰器(请查阅<详解Python装饰器>),本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回 ...
- Python装饰器的高级用法(翻译)
原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...
- Python学习第四十天函数的装饰器用法
在软件开发的过程中,要遵循软件的一些原则封装的,不改变原有的代码的基础增加一些需求,python提供了装饰器来扩展函数功能,下面说说函数装饰器用法 def debug(func): def ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
- [转]python 装饰器
以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...
随机推荐
- Loadrunner乱码问题解决方案(录制&&运行)
在使用Loadrunner录制和回放时有时会出现乱码,从而导致脚本运行失败,这让我们很难定位脚本问题所在. 1.乱码产生的原因 1)loadrunner工具使用的是UTF-8编码,但被测系统使用的是G ...
- BZOJ.4009.[HNOI2015]接水果(整体二分 扫描线)
LOJ BZOJ 洛谷 又是一个三OJ rank1!=w= \(Description\) (还是感觉,为啥非要出那种题目背景啊=-=直接说不好么) 给定一棵树和一个路径集合(每条路径有一个权值).\ ...
- NOIP2017 d1t2 时间复杂度
题目传送门:洛谷P3952 大模拟不解释 #include<iostream> #include<cstdio> #include<cmath> #include& ...
- rmq问题模板处理
rmq问题: 先贴一下定义 范围最值查询 维基百科,自由的百科全书 范围最值查询(Range Minimum Query),是针对数据集的一种条件查询.若给定一个数组 A[1, n],范围最值查询指定 ...
- CSS入门介绍(二)CSS选择器
css选择器 什么是选择器? 选择器是你构造好网页的结构,需要给这些结构赋予样式,这时候就需要用到选择器,利用选择器将元素与样式一一对应:两者的对应关系可以是一对一,一对多,多对一. 选择器的分类: ...
- viewport的故事(一)
部分翻译 自原文 https://www.quirksmode.org/mobile/viewports.html 概念:设备像素和CSS像素 设备像素可以通过 screen.width/he ...
- 九、JSP入门(1)
JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. 1.2 JSP的 ...
- Java作业一 (2017-9-10)
/*程序员龚猛*/ 1.3 public class Helloworld{ public static void main(String[] args) { System.out.printl ...
- 解决archlinux下QT程序,以及wineQQ无法输入中文(.xinitrc)
昨天安了i3wm,发现fcitx在很多程序中无法输入中文,nixnote2,还有ss-qt5 查了wiki,明明有在~/.xinitrc中加入 export XMODIFIERS=@im=fcitx ...
- 关于python列表和元组的基本操作
一.列表 列表是python中最常出现的一种数据存储形式,掌握列表的基本操作可以快速而有效的提高我们的代码书写效率.列表中存放的数据有如下基本操作:如增.删.改.查,掌握了这四个操作,就基本掌握了列表 ...