最简单的模板是这样的

 #-*-coding:utf-8-*-

 def outer(func):
def inner():
print 'before'
func()
print 'after'
# return r
return inner
'''
def outer_1(func):
def inner():
print 'before 11'
func()
print 'after 22'
# return r
return inner @outer_1
'''
@outer
def F1():
print 'test' if __name__ == '__main__':
F1()
'''
运行结果
before
test
after
[Finished in 0.1s]
'''

--装饰器也能用2个,把注释打开

函数带多个参数,装饰器对应修改以适合多种情况

 # -*- coding: utf-8 -*-

 from time import ctime
from time import sleep def ftfunc(func):
def timef(*s,**gs):
print "[%s] %s() called" % (ctime(),func.__name__)
return func(*s,**gs)
return timef @ftfunc
def foo(*s,**gs):
print(s)
print(gs) if __name__ == '__main__':
foo()
foo(1)
foo(1,2)
foo(1,2,3)
stu = {'name' : 'alam' ,'age' :12}
foo(1,2,3,**stu)
'''
运行结果
[Wed Jun 14 15:49:55 2017] foo() called
()
{}
[Wed Jun 14 15:49:55 2017] foo() called
(1,)
{}
[Wed Jun 14 15:49:55 2017] foo() called
(1, 2)
{}
[Wed Jun 14 15:49:55 2017] foo() called
(1, 2, 3)
{}
[Wed Jun 14 15:49:55 2017] foo() called
(1, 2, 3)
{'age': 12, 'name': 'alam'}
[Finished in 0.1s] '''

函数带多个参数,装饰器也带多个参数

 # -*- coding: utf-8 -*-

 def decrator(*dargs, **dkargs):
def wrapper(func):
def _wrapper(*args, **kargs):
print "decrator param:", dargs, dkargs
print "function param:", args, kargs
return func(*args, **kargs)
return _wrapper
return wrapper @decrator(1, a=2)
def foo(x, y=0):
print "foo", x, y if __name__ == '__main__':
foo(3, 4) '''
执行结果
decrator param: (1,) {'a': 2}
function param: (3, 4) {}
foo 3 4
[Finished in 0.1s]
'''

函数带多个参数,装饰器能转换参数类型

 # -*- coding: utf-8 -*-

 def validate(**vkargs):
def decorator(func):
def wrapper(**kargs):
for key in vkargs:
# 根据vkargs中的参数的类型对kargs的参数进行类型转换
kargs[key] = vkargs[key](kargs[key])
return func(**kargs)
return wrapper
return decorator @validate(x=int, y=float, z=float)
def move(x, y, z):
print "move %d (%0.2f, %0.2f)"%(x, y, z) if __name__ == '__main__':
move(x="", y="0.2", z="0.3")
'''
运行结果
move 1 (0.20, 0.30)
[Finished in 0.2s]
'''

一个简单的例子,登录页面

 # -*- coding: utf-8 -*-

 #模拟网站登陆访问认证

 name = 'abc'
password='' def certi(model):#装饰器
def outr(fun):#装饰器加参数需要多加一层嵌套
def login(*args,**kwargs):#为了兼容各类函数参数,添加 *args,**kwargs 不固定参数
if model=='password':
print('enter password')
user_name = raw_input('user_name ').strip()
paswd=raw_input('password ').strip()
if user_name==name and paswd==password:
print('pass')
return fun(*args,**kwargs)
else:
print('error ')
exit()
elif model=='lamp':
print('this is lamp')
return fun(*args,**kwargs)
else:
print('error')
return login
return outr def indxe():
print('home page !!') @certi(model='password')
def user():
print('user page !!') @certi(model='lamp')
def bbs(name):
print('bbs %s!!'%name) if __name__ == '__main__':
indxe()
user()
bbs(name='yjj')
'''
运行结果
home page !!
enter password
user_name abc
password 123
pass
user page !!
this is lamp
bbs yjj!!
'''

-----------------20170711 再次理解-----------------

1.简单的装饰器

2.带参数的装饰器

3.多个装饰器

python 装饰器 (多个参数的函数,带参数的装饰器)的更多相关文章

  1. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  2. Qt 信号槽如何传递参数(或带参数的信号槽)

                                    信号槽如何传递参数(或带参数的信号槽) 利用Qt进行程序开发时,有时需要信号槽来完成参数传递.带参数的信号槽在使用时,有几点需要注意的地 ...

  3. 装饰器带类参数 & 一个函数应用多个装饰器

    装饰器:不改变原函数的基础上,给函数增加功能的方式,称为装饰器 即:为已经存在的对象添加额外的功能 装饰器其实就是一个闭包,把一个函数当做参数后返回一个替代版的函数 decos.py:(装饰器的参数类 ...

  4. python 【第三篇】:函数及参数

    函数背景 在学习函数之前,一直遵循:面向过程编程: 根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: ...

  5. c++——默认参数、函数占位参数

    2 默认参数 /*1 C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 */ void myPrint(int x = 3) { printf ...

  6. httpclient post请求例子(无参数名与带参数名的例子),多线程并发处理

    版本:4.1 带参数名的情况 HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url ...

  7. c24--预编译,宏定义(带参数,不带参数)

    // // main.c // 宏定义 #include <stdio.h> void test(); /* 预处理指令:在我们的文件翻译成0和1之前做的操作我们称之为预处理指令,一般以# ...

  8. C#发送Post请求,带参数,不带参数,指定参数

    1.不带参数发送Post请求 /// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> /// <param na ...

  9. Python装饰器实现带参数和不带参数

    1 def log(text=None): 2 3 if isinstance(text, str): 4 def decorator(func): 5 @functools.wraps(func) ...

  10. 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行

    一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的. 对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打 ...

随机推荐

  1. Setting an appropriate geodatabase spatial domain

    原文地址:http://webhelp.esri.com/arcgisdesktop/9.1/body.cfm?tocVisable=1&ID=1470&TopicName=Setti ...

  2. Build a Restful Service

    最近项目中遇到的REST的问题很多,很多情况下受weblogic以及Jdeveloper版本的影响,无法直接从Jdeveloper中生成一个RESTful Service出来,所以基于流行的Sprin ...

  3. PostgreSQL配置文件--WAL

    3 WAL WRITE AHEAD LOG 3.1 Settings 3.1.1 fsync 字符串 默认: fsync = on 开启后强制把数据同步更新到磁盘,可以保证数据库将在OS或者硬件崩溃的 ...

  4. Linux-C网络编程之epoll函数

    上文中说到假设从100的不同的地方取外卖,那么epoll相当于一部手机,当外卖到达后,送货员能够通知你.从而达到每去必得,少走非常多路. 它是怎样实现这些作用的呢? epoll的功能 epoll是se ...

  5. Python批量修改文件夹内所有json文件中部分内容

    #coding=utf-8 import os import json #获取目标文件夹的路径 filedir = os.getcwd()+'/ceshi' #获取文件夹中的文件名称列表 filena ...

  6. g++ 链接静态库命令应该放在最后

    昨天编译去年写的FloorServer,居然一堆错误: chu@chu-laptop:/media/E/work/github/FloorServer/FloorServer$ makeg++ -g ...

  7. 转: android 内存检测工具 LeakCanary 说明

    http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ LeakCanary 中文使用说明 10 May 2015 LeakCanary Andr ...

  8. Jfinal极速开发微信系列教程(三)--------------对JSP的支持以及部署Tomcat运行异常问题

    本文章主要解决以下问题: 1.Jfianl对JSP的支持2.Jfianl Maven项目部署到Tomcat,启动项目异常问题解决 第一个问题重现截图解决方案:1.在configConstant中添加视 ...

  9. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-PLC支持哪些PLC语言类型

    PLC的标准化语言,统称为IEC 61131-3,该规范下有五种不同的语言可以创建PLC程序,TwinCAT都支持. IL(指令列表): 每条指令都从一个新行开始并包含一个操作和一个或多个操作数,一条 ...

  10. 【DB2】国标行业分类存储,通过SQL查询出层级关系

    新建表 DROP TABLE Industry; CREATE TABLE Industry( IndustryCode VARCHAR(40),IndustryName VARCHAR(100),P ...