首页 > 代码库 > python高级编程之装饰器01
python高级编程之装饰器01
# -*- coding: utf-8 -*-
# python:2.x
__author__ = ‘Administrator‘
#装饰器01
#特点是:使得函数和方法封装(接收一个函数并返回增强版本一个函数)
#语法:原始场景可以将方法 在定义首部将其定义为类方法或者静态方法,在未使用装饰器之前,语法如下:
class WhatFort(object):
def it(cls):
print ‘work with %s:‘%cls
it=classmethod(it)
def uncommon(self):
print ‘i could be a global function‘
unicode=staticmethod(unicode)
#当方法很大或者在该方法 中有多个转换时,这样就变的很难使用
#使用装饰器之后
class A(object):
@classmethod
def it(cls):
print ‘work with %s:‘%cls
@staticmethod
def unicode():
print ‘i could be a global function‘
a=A()
a.it()#work with <class ‘__main__.A‘>:
a.unicode()#i could be a global function
#如何编写装饰器呢?
#通用方法
def mydecorator(func):
def _mydecorate(*args,**kwargs):
#在调用实际函数之前做些填充工作
res=func(*args,**kwargs)
#在调用完之后进行某些填充工作
return res
#返回子函数
return _mydecorate
#为子函数应用一保比如 _mydecorate之类明确的名称,而不像前面那些函数这样通用名字是一个好习惯,因为明确名称更方便在错误发生时回溯--可以知道正在处理指定的装饰器
#当装饰器需要参数时,必须使用第二级封装
def my(ar1,ar2):
def _my(func):
def __my(*a,**k):
#在调用实际函数之前做些填充工作
res=func(*a,**k)
#在调用完之后进行某些填充工作
return res
#返回子函数
return __my
return _my
#因为装饰器在模块第一次被读取时由解释程序装入,所以它们的使用必须受限于总体上可以应用封装器,如果装饰器与方法的类或者所增强的函数签名绑定,它应该被重构为常规可调用对象
#注意:装饰器应该关注于所封装的函数或者方法接收和返回的参数,如果需要,应该尽可能限制其内省工作
#常见的装饰器模式括号(参数检查,缓存,代理,上下文提供者)
#更多(由网友提供:)http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
#http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
#http://blog.csdn.net/hackerain/article/details/7842159