zoukankan      html  css  js  c++  java
  • 闭包和装饰器

    闭包和装饰器

    什么是闭包

    闭包从字面意思上理解就是封闭包含,表现形式就是一个函数包含着另外一个函数。闭包是指:函数内部函数对外部作用域而非全局的引用

    def outter():
    	x = 1
    	def inner():
    		print(x)
    	return inner # 返回inner函数对象
    
    f = outter() # 返回函数对象
    f() # 调用inner, 会打印1
    
    # 还可为外层函数传入参数
    
    def outter(x):
    	def inner():
    		print(x)
    	return inner
    
    f = outter(1)
    f() # 同样打印1
    ##
    

    闭包的意义

    返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。

    什么是装饰器

    什么是装饰器

    为被装饰对象增加新的功能,而不改变被装饰对象的代码和调用方式。

    • 装饰器本身其实是任意可以调用的对象
    • 被装饰的对象可以是任意可调用的对象
    import time
    
    def test():
    	print("test func")
    	time.sleep(1)
    
    def time_count(func):
    	def wrapper():
    		start = time.time()
    		func()
    		end = time.time()
    		print(end - start)
    	return wrapper
    
    test = time_count(test) # 调用时会返回wrapper这个函数对象,通过赋值方式把它重新命名为test, 那么调用test就相当于调用wrappwer
    
    # 如果test需要传入参数,还可以使用为其传入参数
    
    def test(a, b):
    	print("test func")
    	time.sleep(1)
    
    def time_count(func):
    	def wrapper(*args, **kargs): # 在wrapper中使用*args, **kargs可以捕获所有参数
    		start = time.time()
    		func(*args, **kargs)
    		end = time.time()
    		print(end - start)
    	return wrapper
    
    test = time_count(test) 
    
    

    语法糖

    test = time_count(test) 
    # 上面这种方式,可以使用下面的方法实现
    @time_count
    def test():
    	print("test func")
    
    

    带参数的装饰器

    def test(a, b):
    	print("test func")
    	time.sleep(1)
    
    def outter("arg1"):
    	def time_count(func):
    		def wrapper(*args, **kargs): # 在wrapper中使用*args, **kargs可以捕获所有参数
    			print("use arg1")
    			start = time.time()
    			func(*args, **kargs)
    			end = time.time()
    			print(end - start)
    		return wrapper
    	return time_count
    	
    test = outter('args')(func) # 这样就可以为装饰器传入参数了
    
  • 相关阅读:
    PAT 甲级 1128 N Queens Puzzle
    HDU 1995 R-汉诺塔V
    PAT L1-039 古风排版
    PAT L2-028 秀恩爱分得快
    ZOJ 2060 A-Fibonacci Again
    HDU 2079 选课时间
    HDU 1016 Prime Ring Problem
    理论相关概念原理
    单播字符、字符串收发
    OSAL的原理
  • 原文地址:https://www.cnblogs.com/YajunRan/p/11575992.html
Copyright © 2011-2022 走看看