python装饰器的学习笔记
此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习。
一、什么是装饰器
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装饰器的学习笔记的更多相关文章
- Python装饰器模式学习总结
装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...
- python 装饰器初步学习
第一步 简单函数 ''' 简单的函数:调用两次''' def myfunc(): print ('myfunc() called.') myfunc() myfunc() 第二步 装饰器为调用函数提供 ...
- Python 装饰器学习心得
最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- (转载)Python装饰器学习
转载出处:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方 ...
- Python装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- ...
- 【转】九步学习python装饰器
本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白 ...
- Python学习:11.Python装饰器讲解(二)
回顾 上一节我们进行了Python简单装饰器的讲解,但是python的装饰器还有一部分高级的使用方式,这一节就针对python装饰器高级部分进行讲解. 为一个函数添加多个装饰器 今天,老板又交给你一个 ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
随机推荐
- 未设置BufferSize导致FTP下载速度过慢的问题
開始下载前设置BufferSize就可以解决: ftpClient.setBufferSize(1024*1024); 查看commons-net的源代码.能够发现假设未设置该參数.将会一个字节一个字 ...
- hdu4711Weather 概率dp
//第i个城市到第j个城市的概率ma[i][j] //第i天的天气天气wet[i] //第i个城市天气为j的概率wet_m[i][j] //Hovey从0点開始,找出其概率最大的路线 //dp[i][ ...
- python访问纯真IP数据库的代码
通过IP地址判断客户端是网通的还是电信的. 使用一个纯文本的IP纯真数据库,用Python写了一个小程序. 核心代码: #!/usr/bin/env python #site www.jbxue.co ...
- Atitit.js获取上传文件全路径
Atitit.js获取上传文件全路径 1. 默认的value只能获取文件名..安全原因.. 1 2. Firefox浏览器的读取 1 3. Html5 的file api 2 4. 解决方法::使用a ...
- atitit.系统托盘图标的设计java swing c# .net c++ js
atitit.系统托盘图标的实现java swing c# .net c++ js 1. 系统托盘图标的结构 1 2. Java swing的实现 1 3. .net的实现 1 4. C++的实现 1 ...
- [svc][jk]监控jvm的一个坑
监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...
- 写一个简单的form表单,当光标离开表单的时候表单的值发送给后台
<body> <form action="index.php"> <input type="text" name="tx ...
- 《The Joy of X》
来到园子已经几个月了,平时也就看看新闻.招聘信息,偶尔也会看看技术文章.作为一名非计算机专业的学生,我深深地被技术的魅力所吸引.就在半个多月前,我开通了自己的博客,以便记录自己的成长经历,也能与园子里 ...
- 分享 stormzhang的Andoid学习之路
硬件 电脑–推荐Mac 首先声明我不是果粉,个人Windows,Linux,Mac OX系统均用过, 只能说Windows上面的开发工具简直难以恭维,尤其命令行超级难用,而Linux自己必须得花不少时 ...
- c# 获取某日期所在周的第一天和最后一天(转)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WyfC ...