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装饰器相关推荐

  1. python高级编程函数_Python高级编程之十大装B语法

    for - else 什么?不是 if 和 else 才是原配吗?No,你可能不知道,else 是个脚踩两只船的家伙,for 和 else 也是一对,而且是合法的.十大装B语法,for-else 绝对 ...

  2. python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象

    第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...

  3. 【Python高级编程】

    Python高级编程:技巧代码的玄学与艺术 一.编程语言介绍 Python 作为一门优秀的编程语言,有着很多优势: 简单易学 Python有简单的语法,易于阅读和学习,很适合初学者.它的设计哲学是&q ...

  4. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

    今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...

  5. python高级编程-网络编程、多任务

    python高级编程 1 IP地址 用来在网络中标记一台电脑:在本地局域网上是唯一的. 2 端口 一个程序需要收发网络数据,就需要端口号. 3 socket 创建socket # 创建tcp sock ...

  6. Python 高级编程笔记之类别

    目录: 子类化内建类型 访问超类中的方法-super 描述符 & 属性 元编程 主要内容: 1.子类化内建类型 # -*- coding:utf-8 -*-class Folder(list) ...

  7. python高级编程(3) - 深入类和多态

    深入类和多态 一,鸭子类型和多态 鸭子类型 当你看到一只鸟走起来想鸭子,游泳起来像鸭子,叫起来像鸭子,那么这只鸟就叫做鸭子类型 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为. 我们只关心一个 ...

  8. 4万字【Python高级编程】保姆式教学,进阶感觉到吃力?学完这些就轻松了

    前几天和一个小伙子聊天时,发现了一个问题,他从零开始学Python,学完列表.字典和函数等基础之后,就开始往爬虫方向进阶学习,结果又花了一个多月的时间,啥也没学成,反而寸步难行. 其实这个问题的主要原 ...

  9. python重写和装饰器_python装饰器

    python装饰器的本质,就是闭包! 我们一般谈Python的闭包,都是指普通的入参,而谈装饰器的时候,入参一定有函数!闭包和装饰器,返回的都是函数.函数是代码的最小封装单位,装饰器作用于函数,它不影 ...

最新文章

  1. dataframe 通配符筛选
  2. 网易云信亮相LiveVideoStackCon 2019,分享BBR在实时音视频领域的应用
  3. sigmoid和softmax总结
  4. java+JNI 生成包头文件与调用实例
  5. Oracle作业5——多表查询、子查询
  6. ASP.NET C# 文件下载速度限制
  7. 安卓版有道词典的离线词库-《21世纪大英汉词典》等_我是亲民_新浪博客
  8. python项目实战:天眼查询你所需的公司信息
  9. Error: L6218E: Undefined symbol LED_Init (referred from main.o).
  10. Varargs(可变个数形参)
  11. html5 微网页 点餐_使用HTML5和微数据向网页添加电话号码
  12. 用K-means聚类分类不同行业的关税模型
  13. Phoenix二级索引那些事儿(下)
  14. 计算语言学之语法理论
  15. unity 骨骼物理 头发 布料模拟
  16. VS2019打包程序安装后无法运行
  17. java实现生成二维码及扫码登录
  18. 赛维时代IPO过会:第一季净利降71% 出口跨境电商热度降温
  19. 【数学】幂运算与快速幂取余
  20. DVD刻录不可小觑:教你十二招刻录绝技

热门文章

  1. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_MySQL入门简记
  2. java string replace 重载_关于Java:如何使用replace(char,char)替换字符b的所有实例为空...
  3. 计算机网络技术教材多少钱,计算机网络技术课程标准教材.doc
  4. python程序中想使用正则表达式_python中正则表达式的使用方法
  5. Snap svg:路径变换和相交计算
  6. 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图
  7. python中setup什么意思_一个关于python3中setup.py小概念
  8. 将结构体写入文件_将COCO检测结果写入json文件
  9. ELF动态库加载技术
  10. 服务器部署 配置jetty运行参数_Zookeeper+websocket实现对分布式服务器的实时监控...