python基础之装饰器

Posted moshang-huakai

tags:

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

一、闭包概念

#定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包.

def outer():
    x = 10
    def inner():  #条件一:inner是内部函数
        print(x)  #条件二:外部环境的一个变量
    return  inner


inenr()  #报错,找不到引用变量

func = outer()#将inner的引用对象赋值给in_func
func() #相当于执行inner()

 

二、装饰器

#定义:本质依旧是函数,其作用是 在不修改代码的前提下,为已经存在的函数添加额外的功能。

import time

def show_time(f):  # 此函数作用相当于:将旧函数带入,返回一个同名新函数

    def inner():
        start = time.time()
        f()
        end = time.time()
        print(spend %s % (end -start))
    return  inner
    

@show_time  # 等同于 foo =show_time(foo) = inner
def foo():
    print(hello)
    time.sleep(2)


foo() #等同于inner()

 

三、被装饰函数的参数

import time

def show_time(f):  

    def inner(a,b):
        start = time.time()
        f(a,b)
        end = time.time()
        print(spend %s % (end -start))
    return  inner
    

@show_time  
def foo(a,b):
    print(a+b)
    time.sleep(1)


foo(1,2) #等同于inner(1,2)

 

四、装饰器参数

import time

def logger(flag):

    def show_time(f):  

        def inner(a,b):
            start = time.time()
            f(a,b)
            end = time.time()
            print(spend %s % (end -start))
            
            if flag==true:
                print(操作日志打印中)
            
        return  inner
        
    return  show_time
    

@logger(true)  
def foo(a,b):
    print(a+b)
    time.sleep(1)
    
@logger(‘‘) 
def fuu(a,b):
    print(a-b)
    time.sleep(1)


foo(1,2) #执行打印操作日志
fuu(1,2) #不执行打印操作日志

‘‘‘
@logger(‘true‘) 做了两件事:

    (1)logger(‘true‘):得到闭包函数show_time,里面保存环境变量flag

    (2)@show_time   :foo=show_time(foo)

上面的logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。
当我们使用@logger(‘‘)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。
‘‘‘

 

以上是关于python基础之装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python基础之装饰器

python基础之装饰器

python基础之装饰器

python基础之装饰器

Python面向对象学习之八,装饰器

Python成长之路第五篇:Python基础之装饰器