码迷,mamicode.com
首页 > 编程语言 > 详细

python全栈闯关--11-装饰器初识

时间:2019-10-19 20:53:29      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:形参   **kwargs   语法   return   ima   执行   返回   调用   %s   

1、装饰器形成

当不想修改原函数,未函数前后添加功能时,就可以使用装饰器,在函数前后增加功能。

装饰器的初始形成

import time

def timer(f):
    def inner():
        print("我是装饰器,我来装饰了!!!")
        start = time.time()
        f()
        end = time.time()
        print(start - end)
    return inner  # 返回inner由于f实现了闭包,直接调用了程序

def func():
    time.sleep(1)
    print("我是小鱼,要作作作。。。有本事来装饰我!")

# 通过inner返回,在func前后进行了函数的功能的扩展
t = timer(func)
t()  # 虽然实现了功能,但是函数的调用名修改了

# 为了不改变调用名,可以赋值给func
func = timer(func)
func()  # 通过装饰器,实现了不修改函数名的装饰

语法糖

在函数前面加,加上@函数名,就可以实现装饰器,叫做语法糖

def timer(f):
    def inner():
        print("我是装饰器,我来装饰了!!!")
        start = time.time()
        f()
        end = time.time()
        print(start - end)
    return inner  # 返回inner由于f实现了闭包,直接调用了程序

@timer
def func():
    time.sleep(1)
    print("我是小鱼,要作作作。。。有本事来装饰我!")

 

2、带参数和返回值的装饰器

import time

def timer(f):
    def inner(a,b):  # inner接收传入的参数
        print("我是装饰器,我来装饰了!!!")
        start = time.time()
        ret = f(a,b)
        end = time.time()
        print(start - end)
        return  ("我是装饰器的返回值!!!",start - end)  # 在闭包内部,实现返回值
    return inner  # 返回inner由于f实现了闭包,直接调用了程序

@timer
def func(a,b):
    time.sleep(1)
    print("我是小鱼,要作作作。。。有本事来装饰我!")
    print("a=%s,b=%s" % (a,b))

ret = func(1,2)  # 参数相当于传递给inner
print(ret)

执行顺序

技术图片

 

 

 

3、传递任意参数的装饰器

通过*args和**kwargs传递任意参数

def warpper(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs)
        return ret
    return inner

@warpper
def func(*args, **kwargs):  #*和**打散
    print("我是被装饰的函数!")
    print(args)
    print(kwargs)

func()  # 传空参数
func(1,2,3,4,b=1, a=2)  # 传任意参数
dic1 = {"a":1, "b":2}
func(*(1,2,3,4),**dic1)  # 打散传递

4、参数位置随感

个人观察结论:*是按顺序打散,形参位置:*args中,args打散后为1 2 3 4,所以args为(1,2,3,4)

def outer(*args):
    print(args)  # (1, 2, 3, 4)
    print(*args)  # 1 2 3 4  元祖被打散
    def inner(*args):
        print(innner, args)
    inner(*args)  # 打散传入inner(1,2,3,4)

outer = outer(1,2,3,4)

 

python全栈闯关--11-装饰器初识

标签:形参   **kwargs   语法   return   ima   执行   返回   调用   %s   

原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11704879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!