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 装饰器
以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...
随机推荐
- Stars HDU - 1541
HDU - 1541 思路:二维偏序,一维排序,一维树状数组查询即可. #include<bits/stdc++.h> using namespace std; #define maxn ...
- python yield 和 yield from用法总结
#例1. 简单输出斐波那契數列前 N 个数#缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列#要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返 ...
- IDEA_Springboot启动Tomcat报错_APR
使用idea新建一个Springboot项目 环境:idea+jdk8 启动异常如下: An older version [1.2.14] of the APR based Apache Tomcat ...
- 解决国内NPM安装依赖速度慢问题
版权声明:本文为博主原创文章,转载请注明原文地址. http://blog.csdn.net/rongbo_j/article/details/52106580 不知道各位是否遇到这种情况,使用N ...
- swust oj 983
利用二叉树中序及后序遍历确定该二叉树的先序序列 1000(ms) 10000(kb) 2606 / 4908 已知二叉树的中序和先序遍历可以唯一确定后序遍历.已知中序和后序遍历可以唯一确定先序遍历,但 ...
- python语法_字符串
字符串 a = 'asdb' #双引号和打印号没区别, 操作 "abc"*2 打印两遍"abc" #字符串 加* 重复打印字符串 “abc”[2:1] #切片 ...
- PHP的运算符
1.算术运算符 2.赋值运算符 基本的赋值运算符是“=”. (1)引用赋值 PHP 支持引用赋值,使用“$var = &$othervar;”语法.引用赋值意味着两个变量指向了同一个数据,没有 ...
- npm是什么,用来干嘛的
网上的 npm 教程主要都在讲怎么安装.配置和使用 npm,却不告诉新人「为什么要使用 npm」.今天我就来讲讲这个话题. 本文目标读者是「不太了解 npm 的新人」,大神您别看了,不然又说我啰嗦了 ...
- git使用:本地分支merge到远程分支
背景:为了更加规范维护自动化测试工程,代码提交流程最近更新了,先拉分支到本地修改,完成后同步到远程分支. 前置条件 (1)本地机器可通过ssh与gitlab服务器通信 (2)gitlab上的测试项目中 ...
- SQLServer 大小写敏感配置
设置表内大小写敏感 ALTER TABLE 表名 ) COLLATE Chinese_PRC_CI_AS --不区分大小写 ALTER TABLE tb ) COLLATE Chinese_PRC_C ...