装饰器

作者: 大地瓜_ | 来源:发表于2018-09-05 20:37 被阅读0次

1、装饰器引入

Python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

在不修改原函数的功能基础上,如果我们想要扩展函数功能(例如统计函数的运行时间)

import time

def func():
    print "hello",
    print "world"

def deco(func):
    startTime = time.time()
    func()
    endTime = time.time()
    print "the time is", (endTime - startTime )

deco(func)

上面代码中,将func作为参数传入函数,其实是一个Python函数内嵌的实现。

如果要调用很多个类似的函数,例如func1、func2....等函数代码会特别复制,因此引入装饰器。

2、装饰器

下面引入一个基本的装饰器

import time


def deco(func):
    def wrapper():
        startTime = time.time()
        func()
        endTime = time.time()
        print "the time is", (endTime - startTime)
    return wrapper


@deco
def func():
    print "hello",
    print "world"

func()

装饰器的基本结构
定义一个内嵌函数wrapper(),然后返回值为内嵌函数,内嵌函数的内部调用函数。python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)

其实函数本质执行的函数为deco(func)

3、带参数的装饰器

如果对于含有参数的装饰器应该怎么处理,即如果在上文中的func(a, b)
我们引入通用装饰效果func(*args, **kwargs),对于任何参数据可以满足,即现在的装饰器代码可以重构为

import time
def deco(func):
   def wrapper(*args, **kwargs):
       startTime = time.time()
       func(*args, **kwargs)
       endTime = time.time()
       print "the time is", (endTime - startTime)
   return wrapper

@deco
def func2(a, b):
   print "hello",
   print "world",
   print a+b

@deco
def func3(a, b,c):
   print "hello",
   print "world",
   print a+b+c

func2(1,2)
func3(1,2,3)

通过在内嵌函数中引入参数,然后传递给调用函数,这样就可以将实现多参数的修饰器,注意记住参数func(*args, **kwargs)

4、多装饰器函数

多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身

def dec1(func):
    print("1111")
    def one():
        print("2222")
        func()
        print("3333")
    return one

def dec2(func):
    print("aaaa")
    def two():
        print("bbbb")
        func()
        print("cccc")
    return two

@dec1
@dec2
def test():
    print("test test")

test()

输出结果

aaaa
1111
2222
bbbb
test test
cccc
3333
def wa1(test):
    def wapper():
        print "<b>"
        test()
        print "</b>"
    return wapper

def wa2(test):
    def wapper():
        print "<i>"
        test()
        print "</i>"
    return wapper

@wa1
@wa2
def test():
    print("test")

test()
<b>
<i>
test
</i>
</b>

上面修饰器由远及近进行计算

相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

      本文标题:装饰器

      本文链接:https://www.haomeiwen.com/subject/ubjzwftx.html