Python中装饰器的用法
- 定义:
- 装饰器本身就是一个函数
- 为其他函数提供附加功能
- 不改变源代码
- 不改变原调用方式
- 装饰器=高阶函数+嵌套函数
- 知识点:
- 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) )
- 高阶函数
- 把函数名当成一个实参传递给另一个函数func(test1) (不改变源代码的前提下添加代码)
- 返回值中包含函数名return deco (不改变函数的调用方式)
- 嵌套函数:函数中加入新的函数def func1(): def func2():
- 典型结构:
def func1(test):
def deco():
#progress
return deco#返回函数的地址,达到不改变调用方式的目的
完整程序:
# __Author__Panda-J____ import time def timer(func): # for test1 & 2
start_time = time.time()
func() # run func and test its running time
end_time = time.time()
print("this func running time is %s" % (end_time - start_time))
return func @timer
def test1():
time.sleep(1)
print("this is test1") @timer
def test2():
time.sleep(1)
print("this is test2") test1()
test2()
带参数的装饰器:
# __Author__Panda-J____ import time def timer(func): # for test1 & 2
def deco(*args,**kwargs):#不定参数
start_time = time.time()
func(*args,**kwargs) # run func and test its running time
end_time = time.time()
print("this func running time is %s" % (end_time - start_time))
return deco @timer
def test1():
time.sleep(1)
print("this is test1") @timer
def test2(arg1):
time.sleep(1)
print("this is test2,",arg1) print(test1())
test2("name")
本段程序的结果是
this is test1
this func running time is 1.000265121459961
None
this is test2, name
this func running time is 1.0000722408294678
问题:
1 为什么print(test1)会为None,原因是因为在装饰器中没有返回(return)任何数值给到test1中。没有可以打印的内容。
2 在28行中,test2有一个位置参数name传给了装饰器deco中,此处的arg=“name”
如果装饰器本身也带参数的情况:
需求:三层网页,分别为index,home,bbs。在登陆home和bbs页面的时候需要输入不同的用户名和密码,正确方可运行对应函数。
思路:
- 定义三个函数
- 加装饰器
- 用不同的用户名和密码(一个为本地Local,一个为ldap)
完整程序
# __Author__Panda-J____
#语法糖 import time
user="jiang"
pssw="123"
def auth(auth_type):#多加了一层函数进行关键字嵌套
print("auth func is",auth_type)
def outer_wrapper(func):#相当于没有装饰器参数时候的那一层
def wrapper(*args,**kwargs):#进行函数的装饰
if auth_type=="local":#使用本地用户名和密码
user_name=input("user_name:").strip()
password=input("paassword:").strip()
if user_name==user and password==pssw:#判定用户名和密码驶入正确
print("\033[32;1mUser authorized\033[0m")
return func(*args, **kwargs)#返回函数进行打印,如果没有这一行,不会执行home和bbs函数中的打印程序,home()将为None,因为没有返回任何内容
else:#用户名和密码输入不正确
exit("\033[31;1mUser failed\033[0m")
elif auth_type=="ldap":#使用ldap的密码
print("plz use ldap password")
return wrapper
return outer_wrapper
def index():
print("welcome index")
@auth(auth_type="local")#home
def home():
print("welcome home")
return "home is best"
@auth(auth_type="ldap")
def bbs():
print("welcome bss") index()
print(home())
bbs()
我所能理解的装饰器的应用场景和关键知识点都归纳了,欢迎各位指正。
Python中装饰器的用法的更多相关文章
- 8.Python中装饰器是什么?
Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...
- Python的装饰器实例用法小结
这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...
- Python核心技术与实战——十四|Python中装饰器的使用
我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...
- Python函数装饰器高级用法
在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...
- python中装饰器的原理以及实现,
python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...
- Python中装饰器(转)
本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生 ...
- python中装饰器修复技术
python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了 ...
- python中装饰器的执行细节
本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...
- python中装饰器(语法糖)概念
“”“” 什么是装饰器? """ 还是通过一个例子来慢慢说明 先看下面的例子 def func_1(x): return x*2 def fun_2(x): return ...
随机推荐
- eslint 入门项目搭建过程
github 地址 : https://github.com/gebin/eslint-demo 运行该项目 npm install npm start 访问 http://localhost:900 ...
- Java经典编程题50道之三十九
写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class Example39 { public static void main(String[] a ...
- 高可用之KeepAlived(一):基本概念和配置文件分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- CentOs下Mongodb的下载与安装
1.下载MongoDB(64位) http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz tar zxvf mongodb-lin ...
- Python 练习册,每天一个小程序----第0000题
题目 第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 Code: from PIL import Image,Imag ...
- python实现汉诺塔移动
汉诺塔问题 汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大 ...
- UVA1601 状态搜索
很有意思的一道题,就是迷宫问题的增强版.但是细节很多,有一个技巧就是把每个可以走的位置编号方便状态判重. AC代码: #include<cstdio> #include<cstrin ...
- 快速掌握Shell编程
作者原创作品,转载请注明出处 (一)Shell编程概述 1.1 shell简述 Shell编程和JavaScript非常相似,Shell和JavaScript都是弱类型语言,同时也都是解释型语言.解释 ...
- Wireshark抓包常见出现错误
转自这里 1. tcp out-of-order(tcp有问题) 解答: 1). 应该有很多原因.但是多半是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元 因为 ...
- numpy 实践记录
reshape是从低维度到高维度.max,sum等函数都是注意axis,不选择就是全体计算. swapaxes 转换轴,将两个选择的轴对调,在CNN中X乘W有的时候需要拉伸,如果轴不同结果不对. 看p ...