python杂记-5(装饰器)
1、被装饰的函数有参数(一个参数):
- def w1(func):
- def inner(arg):
- # 验证1
- # 验证2
- # 验证3
- return func(arg)
- return inner
- @w1
- def f1(arg):
- print(f1)
2、被装饰的函数有参数(两个参数):
- def w1(func):
- def inner(arg1,arg2):
- # 验证1
- # 验证2
- # 验证3
- return func(arg1,arg2)
- return inner
- @w1
- def f1(arg1,arg2):
print(f1)
3、被装饰的函数有参数(三个参数):
- def w1(func):
- def inner(arg1,arg2,arg3):
- # 验证1
- # 验证2
- # 验证3
- return func(arg1,arg2,arg3)
- return inner
- @w1
- def f1(arg1,arg2,arg3):
- print(f1)
4、装饰具有处理n个参数的函数的装饰器:
- def w1(func):
- def inner(*args, **kwargs):
- # 验证1
- # 验证2
- # 验证3
- return func(*args, **kwargs)
- return inner
- @w1
- def f1(arg1, arg2, arg3):
- print(f1)
5、一个函数可以被多个装饰器装饰:
- def w2(func):
- def inner(*args, **kwargs):
- # 验证1
- # 验证2
- # 验证3
- return func(*args, **kwargs)
- return inner
- @w1
- @w2
- def f1(arg1, arg2, arg3):
- print(f1)
6、更牛逼的装饰器:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- def Before(request, kargs):
- print('before')
- def After(request, kargs):
- print('after')
- def Filter(before_func, after_func):
- def outer(main_func):
- def wrapper(request, kargs):
- before_result = before_func(request, kargs)
- if (before_result != None):
- return before_result;
- main_result = main_func(request, kargs)
- if (main_result != None):
- return main_result;
- after_result = after_func(request, kargs)
- if (after_result != None):
- return after_result;
- return wrapper
- return outer
- @Filter(Before, After)
- def Index(request, kargs):
- print('index')
7、functools.wraps
上述的装饰器虽然已经完成了其应有的功能,即:装饰器内的函数代指了原函数,注意其只是代指而非相等,原函数的元信息没有被赋值到装饰器函数内部。例如:函数的注释信息
- def outer(func):
- def inner(*args, **kwargs):
- print(inner.__doc__) # None
- return func()
- return inner
- @outer
- def function():
- """
- asdfasd
- :return:
- """
- print('func')
如果使用@functools.wraps装饰装饰器内的函数,那么就会代指元信息和函数。
- def outer(func):
- @functools.wraps(func)
- def inner(*args, **kwargs):
- print(inner.__doc__) # None
- return func()
- return inner
- @outer
- def function():
- """
- asdfasd
- :return:
- """
- print('func')
python杂记-5(装饰器)的更多相关文章
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- python笔记 - day4-之装饰器
python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- 第二篇:python高级之装饰器
python高级之装饰器 python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- Python进阶之装饰器
函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...
随机推荐
- Lnmp下安装memcached
Lnmp下安装memcached 1.先安装 libevent,再安装 Memcached主程序 # tar xf libevent-2.0.21-stable.tar.gz # cd ...
- Oracle10GODP连接11G数据库,出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
一.出现症状 1.使用sqlplus连接正常 2.C#使用10g的ODP.NET连接时,报上面的错误 二.原因 1.Oracle11G之前密码是不区分大小写的,从11G开始默认密码区分大小写 2.使用 ...
- Windows重新建立图标缓存
有的时候,快捷方式的图标会因各种优化软件而变得面目全非,这时就需要重新建立图标缓存 新建一个文本文档,把文件的后缀名修改成.bat 的例如 icon.bat 在里面填写下面的内容: rem 关闭exp ...
- 浅议tomcat与classloader
关于tomcat和classloader的文章,网上多如牛毛,且互相转载,所以大多数搜到的基本上是讲到了tomcat中classloader的几个层次,对于初接触classloader,看了之后还是只 ...
- Python中的内置函数
2.1 Built-in Functions The Python interpreter has a number of functions built into it that are alway ...
- FreeBSD 路由详解
在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机 -路由器来完成连通.路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,具有一个 ...
- linq to sql 增删改查
ORM<Object Relation Mapping> Linq To Sql: 一.建立Linq To Sql 类 : 理解上下文类: Linq To Sql 类名+context 利 ...
- 初识 Asp.Net内置对象之Application对象
Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...
- Android之开源项目工具库篇
本文转自:http://www.trinea.cn/android/android-open-source-projects-dev-lib/ 本文中你可以找到那些精美App中各种有特性的View,如 ...
- OC7_代理的基本概念
// // Cat.h // OC7_代理的基本概念 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangxue ...