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

【python基础】之装饰器

时间:2018-09-15 13:07:14      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:import   end   color   功能   %s   fun   本质   bsp   允许   

一、闭包概念

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

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基础】之装饰器

标签:import   end   color   功能   %s   fun   本质   bsp   允许   

原文地址:https://www.cnblogs.com/moshang-huakai/p/9650606.html

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