python高级编程装饰器_Python装饰器
def my_decorator(function):
def _my_decorator(*args, **kw):
#在调用实际函数之前做些填充工作
res = function(*args, **kw)
#做完某些填充工作之后
return res
#返回子函数
return _my_decorator
当装饰器需要参数时,必须使用第二级封装。
def my_decorator(arg1, arg2):
def _my_decorator(function):
def __my_decorator(*args, **kw):
res = function()
return res
return __my_decorator
return _my_decorator
引用
因为装饰器在模块第一次被读取时由解释程序装入,所以它们的使用必须受限于总体上可以应用的封装器。如果装饰器与方法的类或所增强的函数签名绑定,它应该被重构为常规的可调用对象,从而避免复杂性。在任何情况下,当装饰器处理API时,一个好的方法是将它们聚集在一个易于维护的模块中。
参数检查:
def check_param_isvalid():
def check(method):
def check_param(*args,**kwargs):
for a in args:
assert isinstance(a, int),"arg %r does not match %s" % (a,int)
assert a > 100000,"arg %r must gt 100000" % a
return method(*args, **kwargs)
return check_param
return check
@check_param_isvalid()
def foo(*args):
print args
foo(200000,500000)
缓存:
import time
import hashlib
import pickle
cache = {}
def is_obsolete(entry, duration):
return time.time() - entry['time'] > duration
def computer_key(function, args, kw):
key = pickle.dumps((function.func_name, args, kw))
return hashlib.sha1(key).hexdigest()
def memoize(duration=30):
def _memoize(function):
def __memoize(*args, **kw):
key = computer_key(function, args, kw)
if key in cache and not is_obsolete(cache[key], duration):
print 'wo got a winner'
return cache[key]['value']
result = function(*args, **kw)
cache[key] = {'value':result,'time':time.time()}
return result
return __memoize
return _memoize
@memoize()
def very_complex_stuff(a,b):
return a + b
print very_complex_stuff(2,2)
代理:
class User(object):
def __init__(self, roles):
self.roles = roles
class Unauthorized(Exception):
pass
def protect(role):
def _protect(function):
def __protect(*args, **kw):
user = globals().get('user')
if user is None or role not in user.roles:
raise Unauthorized("I won't tell you")
return function(*args, **kw)
return __protect
return _protect
tarek = User(('admin', 'user'))
bill = User(('user',))
class MySecrets(object):
@protect('admin')
def waffle_recipe(self):
print 'use tons of butter!'
these_are = MySecrets()
user = tarek
these_are.waffle_recipe()
user = bill
these_are.waffle_recipe()
上下文提供者:
from threading import RLock
lock = RLock()
def synchronized(function):
def _synchronized(*args, **kw):
lock.acquire()
try:
return function(*args, **kw)
finally:
lock.release()
return _synchronized
@synchronized
def thread_safe():
print 'haha'
thread_safe()
补充:http://2057.iteye.com/blog/1838398
参考资料:
Python高级编程
分享到:
2013-10-15 22:59
浏览 1214
评论
python高级编程装饰器_Python装饰器相关推荐
- python高级编程函数_Python高级编程之十大装B语法
for - else 什么?不是 if 和 else 才是原配吗?No,你可能不知道,else 是个脚踩两只船的家伙,for 和 else 也是一对,而且是合法的.十大装B语法,for-else 绝对 ...
- python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象
第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...
- 【Python高级编程】
Python高级编程:技巧代码的玄学与艺术 一.编程语言介绍 Python 作为一门优秀的编程语言,有着很多优势: 简单易学 Python有简单的语法,易于阅读和学习,很适合初学者.它的设计哲学是&q ...
- python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)
今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...
- python高级编程-网络编程、多任务
python高级编程 1 IP地址 用来在网络中标记一台电脑:在本地局域网上是唯一的. 2 端口 一个程序需要收发网络数据,就需要端口号. 3 socket 创建socket # 创建tcp sock ...
- Python 高级编程笔记之类别
目录: 子类化内建类型 访问超类中的方法-super 描述符 & 属性 元编程 主要内容: 1.子类化内建类型 # -*- coding:utf-8 -*-class Folder(list) ...
- python高级编程(3) - 深入类和多态
深入类和多态 一,鸭子类型和多态 鸭子类型 当你看到一只鸟走起来想鸭子,游泳起来像鸭子,叫起来像鸭子,那么这只鸟就叫做鸭子类型 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为. 我们只关心一个 ...
- 4万字【Python高级编程】保姆式教学,进阶感觉到吃力?学完这些就轻松了
前几天和一个小伙子聊天时,发现了一个问题,他从零开始学Python,学完列表.字典和函数等基础之后,就开始往爬虫方向进阶学习,结果又花了一个多月的时间,啥也没学成,反而寸步难行. 其实这个问题的主要原 ...
- python重写和装饰器_python装饰器
python装饰器的本质,就是闭包! 我们一般谈Python的闭包,都是指普通的入参,而谈装饰器的时候,入参一定有函数!闭包和装饰器,返回的都是函数.函数是代码的最小封装单位,装饰器作用于函数,它不影 ...
最新文章
- dataframe 通配符筛选
- 网易云信亮相LiveVideoStackCon 2019,分享BBR在实时音视频领域的应用
- sigmoid和softmax总结
- java+JNI 生成包头文件与调用实例
- Oracle作业5——多表查询、子查询
- ASP.NET C# 文件下载速度限制
- 安卓版有道词典的离线词库-《21世纪大英汉词典》等_我是亲民_新浪博客
- python项目实战:天眼查询你所需的公司信息
- Error: L6218E: Undefined symbol LED_Init (referred from main.o).
- Varargs(可变个数形参)
- html5 微网页 点餐_使用HTML5和微数据向网页添加电话号码
- 用K-means聚类分类不同行业的关税模型
- Phoenix二级索引那些事儿(下)
- 计算语言学之语法理论
- unity 骨骼物理 头发 布料模拟
- VS2019打包程序安装后无法运行
- java实现生成二维码及扫码登录
- 赛维时代IPO过会:第一季净利降71% 出口跨境电商热度降温
- 【数学】幂运算与快速幂取余
- DVD刻录不可小觑:教你十二招刻录绝技
热门文章
- idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_MySQL入门简记
- java string replace 重载_关于Java:如何使用replace(char,char)替换字符b的所有实例为空...
- 计算机网络技术教材多少钱,计算机网络技术课程标准教材.doc
- python程序中想使用正则表达式_python中正则表达式的使用方法
- Snap svg:路径变换和相交计算
- 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图
- python中setup什么意思_一个关于python3中setup.py小概念
- 将结构体写入文件_将COCO检测结果写入json文件
- ELF动态库加载技术
- 服务器部署 配置jetty运行参数_Zookeeper+websocket实现对分布式服务器的实时监控...