此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习。

一、什么是装饰器

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

最新文章

  1. Python xlrd、xlwt、xlutils修改Excel文件
  2. GPON和820.1p学习及资料(zt)
  3. .NET平台开发Mongo基础知识
  4. [译] 企业级 OpenStack 的六大需求(第 1 部分):API 高可用、管理和安全
  5. 大数据之tachyon(未完版)
  6. 标志数在wordcount程序中的应用与拓展
  7. 鸟哥的linux私房菜---非常好的linux基础网址【转】
  8. 查看mysql的状态
  9. Contest 7.21(贪心专练)
  10. HTML头部<head>学习
  11. 从腾讯QQ升级游戏之“快速加入游戏”功能的实现缺陷看C/S之间如何正确分配相关协作
  12. iOS中@class #import #include 简介
  13. JQuerry 权威指南的都市笔记
  14. Redis配置文件 翻译 V3.2版本
  15. java(3) if结构
  16. Problem C: 学生的排序
  17. C++异常层次结构
  18. postgresql清理工具
  19. 【css】css 中文字体 unicode 对照表
  20. Unity3D学习笔记(三十二):Xlua(2)

热门文章

  1. 从零開始学android<ScrollView滚动视图.十八.>
  2. 点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。
  3. 一个简单题,引发的思索 + nyoj 1189
  4. 名词解释 ssl、tls、key、crt、cer、x509
  5. 【转】【Mac + Git】之Git pull 强制拉取并覆盖本地代码
  6. 14 javaBean 组件
  7. nested exception is java.lang.VerifyError: Expecting a stackmap frame at bra
  8. 第二百四十二节,Bootstrap列表组面板和嵌入组件
  9. 关于JSP生命周期的叙述,下列哪些为真?
  10. 目标跟踪之卡尔曼滤波---理解Kalman滤波的使用