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

一、什么是装饰器

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装饰器的学习笔记的更多相关文章

  1. Python装饰器模式学习总结

    装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...

  2. python 装饰器初步学习

    第一步 简单函数 ''' 简单的函数:调用两次''' def myfunc(): print ('myfunc() called.') myfunc() myfunc() 第二步 装饰器为调用函数提供 ...

  3. Python 装饰器学习心得

    最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数 ...

  4. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  5. (转载)Python装饰器学习

    转载出处:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方 ...

  6. Python装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- ...

  7. 【转】九步学习python装饰器

    本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白 ...

  8. Python学习:11.Python装饰器讲解(二)

    回顾 上一节我们进行了Python简单装饰器的讲解,但是python的装饰器还有一部分高级的使用方式,这一节就针对python装饰器高级部分进行讲解. 为一个函数添加多个装饰器 今天,老板又交给你一个 ...

  9. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

随机推荐

  1. Tokyo Tyrant(TTServer)系列(六)-数据丢失谁的错

    ,false,1,100);$mem->addServer ("127.9.9.1",1978,false,1,100);$start=microtime(true);for ...

  2. atitit.印度教与java宗教的特点与观念对比 attilax总结

    atitit.印度教与java宗教的特点与观念对比 attilax总结 1. Java就是一种宗教 1 2. Java的教义思想,社区理念,价值观念 2 2.1. 教学语言,类似与印度教的祭祀万能 2 ...

  3. Http basic Auth 认证方式帮助类

    BasicAuthenticationUtil import java.io.IOException; import java.security.MessageDigest; import javax ...

  4. python学习之find()

    定义: find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1. 语法 ...

  5. JS高程3:Ajax与Comet-进度事件、跨源资源共享

    有以下 6 个进度事件  loadstart:在接收到响应数据的第一个字节时触发.  progress:在接收响应期间持续不断地触发.  error:在请求发生错误时触发.  abort:在因 ...

  6. Github上fork项目后与原项目保持同步

    **步骤** 假设来源为 `https://github.com/_original/_project.git` fork 项目为  `https://github.com/_your/_projec ...

  7. JS——简单的正则表达式验证

    <!-- 用户注册:结构层:html;表现层:css;行为层:javascript; html利用ul,li来构造: 注意事项:1.每个Input都要有相应的id,这是在js中去调用的. 2.& ...

  8. 解决linux下/etc/rc.local开机器不执行的原因

    前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙,调试完给了技术支持人员,也没去注意过. 到后来,有几台服务器突然被重启了,这时候领导问,怎么开机启动的脚本没起作用,还被批了一顿,哎,做 ...

  9. Shell面试题4:扫描网络内存活主机案例

    19.1.4企业Shell面试题4:扫描网络内存活主机案例 写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些? [root@st153 tools]# cat check_ ...

  10. redisson笔记

    简介 Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ...