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

一、什么是装饰器

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. PHPCMS 后台学习

    1.final 不能被子类改写,不可扩展2.私有不能被继承3.构造方法,第一个被调用的方法4.static访问 类名::方法名 parent::test();这里test可以不静态 m=模块名& ...

  2. hbase replication原理分析

    本文只是从总体流程来分析replication过程,很多细节没有提及,下一篇文章准备多分析分析细节.   replicationSource启动过程 org.apache.hadoop.hbase.r ...

  3. TCP协议的三次握手和四次挥手过程

    TCP是一种面向连接(连接导向)的.可靠的基于字节流的传输层通信协议.TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认.对失序的数据重新排序.丢弃重复数据. 1.TCP/ ...

  4. 简单讲一下 SpringMVC的执行流程?

    执行流程: 1. 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获(捕获) . DispatcherServlet对请求  URL进行解析 ...

  5. Linux下出现Read-only file system的解决办法

    正常运行中的网站,忽然间出现session目录不可写,连接服务器一看,任何关于写硬盘的命令都不能用,提示Read-only file system,使用一条命令即可搞定此问题: mount -o re ...

  6. matlab和C/C++混合编程--Mex (转载)

    matlab和C/C++混合编程--Mex 最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续 ...

  7. 3G模块(U6300)linux下拨号上网

    U6300支持linux.Android系列嵌入式系统.作为linux内核系统,系统均会自带驱动usbserial,就没有提供专门的U6300V的USB驱动,都是加载系统的usbserial以实现对U ...

  8. c++ 单例模式 对全局变量的替代

    前段时间要实习一个充值接口,创建了一个类(就叫类A好了),这个类A要和另外3个类进行交互,3个类对类A修改的数据是对其他类可见的.这种情况我想到了3个方法: 1.static 静态成员,静态成员为该类 ...

  9. datagrid后台分页js

    $(function () { gridbind(); bindData(); }); //表格绑定function gridbind() { $('#dg').datagrid({ title: ' ...

  10. css背景图片拉伸

    css背景图片拉伸 background-image:url(bg.png); -moz-background-size: 100% 100%; -o-background-size: 100% 10 ...