Python装饰器

一、装饰器的作用

在不改动原函数及其的调用方式的情况下,在原来函数的前后调节功能。

二、装饰器固定模式(最完善的)

def wrapper(fun):
    def extended(*args,**kwargs):  #可接受任意参数
        '''操作'''
        ret = fun(*args,**kwargs)   #调用原函数并传相应的参数和返回结果 
        '''操作'''
        return ret
    return extended
@wrapper
def function():
    pass
        

三、装饰器完善过程

1.简单的装饰器

import time
def function(): #被修饰的函数
    print("hello world!")

def run_time(fun):     #装饰器
    def extend():
        start = time.time()
        fun()    #原函数的调用
        end = time.time()
        return end-start
    return extend

function = run_time(function)  #将原函数名指向扩展函数
time = function() 
print(time)

2.装饰器完善-----返回值

def func():
    return (1,5,64,8)
def wrapper(fun):
    def extend():
        ret = fun()  #用一个变量接收
        return ret   #返回原函数的返回值
    return extend
func = wrapper(func)
func()

3.装饰器完善----参数

def reader(path,mode="r"):
    pass
def writer(path,permission,mode="w",long=1024):
    pass

#由于函数的参数多变,考虑用动态参数。
def wrapper(fun):
    def extend(*args,**kwargs):  #args接收位置参数,kwargs接收默认参数。
        ret = fun(*args,**kwargs)  #*args **kwargs 打散分别传参。 
        return ret  
    return extend

reader = wrapper(reader)
writer = wrapper(writer)
reader()
writer()

4.装饰器完善-----reader = wrapper(reader)-------》语法糖@

def wrapper(fun):
    def extend(*args,**kwargs):  
        ret = fun(*args,**kwargs)  
        return ret
    return extend
#语法糖:@  用法:下面必须紧接着被装饰的函数,装饰器函数写在前面
@wrapper #@wrapper相当于reader = wrapper(reader)
def reader(path,mode="r"):
    pass

@wrapper #@wrapper相当于writer = wrapper(writer)
def writer(path,permission,mode="w",long=1024):
    pass
reader()
writer()
posted @ 2018-08-15 12:57  小雨转晴  阅读(135)  评论(0编辑  收藏  举报