Python学习之路--装饰器

Posted L.Sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习之路--装饰器相关的知识,希望对你有一定的参考价值。

闭包

通俗来讲,闭包就是在函数中定义一个内部的函数,并且这内部函数调用了外部函数中定义的变量,例如:

def outter():
    x = 10
    def inner():
        print(x)
    return inner()
outter()

错误陷阱:

def my_func(*args):
    fs = []
    for i in args:
        def func():
            return i * i
        fs.append(func)
    return fs

fs1, fs2, fs3 = my_func(1,2,3)
print(fs1())
print(fs2())
print(fs3())

什么是装饰器

装饰器一般用于增强一个已经存在的函数或类的功能的函数。

示例

展示程序运行时间为例:

  • 不是用装饰器写法
def foo():
	start_time = time.time()
	print('2222')
	time.sleep(2)
	end_time = time.time()
	print('use %s'%(end_time - start_time))
	
def bar():
	start_time = time.time()
	print('333')
	time.sleep(3)
	end_time = time.time()
	print('use %s'%(end_time - start_time))
  • 使用装饰器
import time

def show_time(f):
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print('use %s'%(end_time - start_time))
    return inner

@show_time
def foo():
    print('333')
    time.sleep(3)

@show_time
def bar():
    print('2222')
    time.sleep(2)

foo()
bar()

被装饰器装饰函数参数传递

  • 以加法器为例
import time

def show_time(f):
    def inner(*args):
        start_time = time.time()
        f(*args)
        end_time = time.time()
        print('use %s'%(end_time - start_time))
    return inner


@show_time
def add(*args):
    Sum=0
    for i in args:
        Sum+=i
    print(Sum)
    time.sleep(3)
add(1,2)

装饰器参数传递

  • 选择被装饰的函数是否进行日志记录
import time
def Is_log(Flag):
	def show_time(f):
	    def inner(*args):
	        start_time = time.time()
	        f(*args)
	        end_time = time.time()
	        if Flag = True:
	        	print('日志')
	        print('use %s'%(end_time - start_time))
	    return inner
	return show_time


@Is_log(True)
def add(*args):
    Sum=0
    for i in args:
        Sum+=i
    print(Sum)
    time.sleep(3)
add(1,2)

以上是关于Python学习之路--装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路6 - 装饰器

Python学习之路:装饰器实现终极版

Python学习之路:装饰器实现

Python学习之路7?装饰器

Python学习之路-装饰器&生成器&正则表达式

Python学习之路day4-函数高级特性装饰器