首页 > 代码库 > 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