首页 > 代码库 > 1.16 Python基础知识 - 装饰器

1.16 Python基础知识 - 装饰器

  Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用。在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等。一个函数可以使用多个装饰器,产生的结果与装饰器的位置顺序有关。

  装饰器基本形式:

  @装饰器1

  def 函数1:

    函数体

  相当于:==》  函数1 = 装饰器1(函数1)

  装饰器特点:

  1、不修改源代码的调用方式

  2、不修改源代码内容

  3、装饰器有高阶函数递归函数相融合的特点

  多个装饰器修饰,示例:

@foo
@spam
def bar():pass

相当于:

def bar():pass

bar = foo(spam(bar))

 

  装饰器示例1(无参数传递):计算程序运行时间

import time
def foo(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time = time.time()
        print(the func run %s . % (stop_time - start_time))
    return wrapper

@foo
def bar():
    time.sleep(3)
    print("In the bar.")


bar()

# 输入结果

In the bar.
the func run 3.016378402709961 .

  装饰器示例2(源代码有参数传递):

import time
def foo(func):
    def wrapper(args):
        start_time = time.time()
        func(args)
        stop_time = time.time()
        print(the func run %s . % (stop_time - start_time))
    return wrapper

@foo
def bar(name):
    time.sleep(3)
    print(Hello %s . % name)

user_name = input(What is your name ?\n)
bar(user_name)

# 输出结果

What is your name ?
zhanghk
Hello zhanghk .
the func run 3.0003373622894287 .

  装饰器示例3(装饰器传递参数):

import time

def foo(n):
    def ac(func):
        def wrapper(args):
            if n == 1:
                start_time = time.time()
                func(args)
                stop_time = time.time()
                print(the func run %s . % (stop_time - start_time))
            else:
                func(args)
        return wrapper
    return ac


@foo(n = 0)    # 由"n"是否等于1来判断是否计算程序运行时间
def bar(name):
    time.sleep(3)
    print(Hello %s . % name)

user_name = input(What is your name ?\n)
bar(user_name)

# 输出结果

What is your name ?
zhanghk
Hello zhanghk .

 

1.16 Python基础知识 - 装饰器