python装饰器的学习笔记
2024-10-20 15:05:06
此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习。
一、什么是装饰器
1、从字面意义来看:
是用来给函数装饰打扮的函数
2、理论上可以理解为:
(1)、不改变函数的运行方式
(2)、不改变函数体内容的情况下给函数添加新的功能
3、装饰器的结构:
装饰器=高阶函数+函数嵌套+闭包
二、装饰器的种类
下面就利用两个例子来实现一下带参装饰器和不带参装饰器使用。
1、不带参数的装饰器
user ={'name':'test','passwd':''} user_status = {'name':None,'login':False} def auth_func(func):
def warper(*args,**kwargs):
if user_status['name'] and user_status['login']:
res = func(*args,**kwargs)
return res
name = input("username: ")
passwd = input("password: ")
if user['name'] == name and user['passwd'] == passwd:
user_status['name'] = name
user_status['login'] = True
res = func(*args,**kwargs)
return res
else:
print("用户名或密码错误")
return warper @auth_func
def index(name):
print("欢迎%s 来到主页" % name) @auth_func
def home(name):
print("我在home下") index("test")
home('test') #输出
username: test
password: 123
欢迎test 来到主页
我在home下
2、带参数的装饰器
auth_user_dict ={'username':None,'password':False} def load_fileBD():
with open("userDB",'r') as f:
return f.read() def auth(auth_type = 'file'):
def auth_func(func):
def wraper(*args,**kwargs):
if auth_type == 'file':
fild_data = load_fileBD()
fild_data = eval(fild_data)
if auth_user_dict['username'] and auth_user_dict['password']:
res = func(*args,**kwargs)
return res
username = input('username: ')
passwd = input('password: ')
for user_info in fild_data:
if username == user_info['username'] and passwd == user_info['password']:
auth_user_dict['username'] = username
auth_user_dict['password'] = passwd
res = func(*args,**kwargs)
return res
else:
print("用户名密码错误")
elif auth_type == 'mysql':
print("从mysql中读取用户并验证,以print代表执行验证")
res = func(*args,**kwargs)
return res
else:
print("没有这种类型的数据库")
return wraper
return auth_func @auth('mysql')
def home(name):
print("%s is login in home" % name) home('test') #输出
从mysql中读取用户并验证,以print代表执行验证
test is login in home
最新文章
- Python xlrd、xlwt、xlutils修改Excel文件
- GPON和820.1p学习及资料(zt)
- .NET平台开发Mongo基础知识
- [译] 企业级 OpenStack 的六大需求(第 1 部分):API 高可用、管理和安全
- 大数据之tachyon(未完版)
- 标志数在wordcount程序中的应用与拓展
- 鸟哥的linux私房菜---非常好的linux基础网址【转】
- 查看mysql的状态
- Contest 7.21(贪心专练)
- HTML头部<;head>;学习
- 从腾讯QQ升级游戏之&ldquo;快速加入游戏&rdquo;功能的实现缺陷看C/S之间如何正确分配相关协作
- iOS中@class #import #include 简介
- JQuerry 权威指南的都市笔记
- Redis配置文件 翻译 V3.2版本
- java(3) if结构
- Problem C: 学生的排序
- C++异常层次结构
- postgresql清理工具
- 【css】css 中文字体 unicode 对照表
- Unity3D学习笔记(三十二):Xlua(2)
热门文章
- 从零開始学android&;lt;ScrollView滚动视图.十八.&;gt;
- 点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。
- 一个简单题,引发的思索 + nyoj 1189
- 名词解释 ssl、tls、key、crt、cer、x509
- 【转】【Mac + Git】之Git pull 强制拉取并覆盖本地代码
- 14 javaBean 组件
- nested exception is java.lang.VerifyError: Expecting a stackmap frame at bra
- 第二百四十二节,Bootstrap列表组面板和嵌入组件
- 关于JSP生命周期的叙述,下列哪些为真?
- 目标跟踪之卡尔曼滤波---理解Kalman滤波的使用