Python3中的装饰器

  • 2020 年 1 月 10 日
  • 筆記

一.装饰器

	@dec  	def func():  # 被装饰对象  		pass
	def outer(func):  # 装饰函数  	    def inner():  	        print("认证成功!")  	        result = func()  	        print("日志添加成功")  	        return result  	    return inner    	@outer  	def f1():  # 被装饰函数      	print("业务部门1数据接口......")
def outer(func):  	def inner(username):  		print("认证成功")  		result = func(username)  		print("日志添加成功")  		return result  	return inner  @outer  def f1(name):  	print("{}正在调用业务部门1的数据接口".format(name))  # 调用方法  f1("Jack")
def outer(func):  	def inner(*args, *kwargs):  		print("认证成功")  		result = func(*args, **kwargs)  		print("日志添加成功")  		return result  	return inner  @outer  def f1(name, age):  	print("{}正在调用业务部门1的数据接口".format(name))  # 调用方法  f1("jack", 19)
	def outer1(func):      def inner(*args,**kwargs):          print("认证成功!")          result = func(*args,**kwargs)          print("日志添加成功")          return result      return inner      def outer2(func):      def inner(*args,**kwargs):          print("一条欢迎信息。。。")          result = func(*args,**kwargs)          print("一条欢送信息。。。")          return result      return inner      @outer1  @outer2  def f1(name,age):      print("%s 正在连接业务部门1数据接口......"%name)    # 调用方法  f1("jack",18)
	# 认证函数  	def  auth(request,kargs):  	    print("认证成功!")    	# 日志函数  	def log(request,kargs):  	    print("日志添加成功")    	# 装饰器函数。接收两个参数,这两个参数应该是某个函数的名字。  	def Filter(auth_func,log_func):  	    # 第一层封装,f1函数实际上被传递给了main_fuc这个参数  	    def outer(main_func):  	        # 第二层封装,auth和log函数的参数值被传递到了这里  	        def wrapper(request,kargs):  	            # 下面代码的判断逻辑不重要,重要的是参数的引用和返回值  	            before_result = auth(request,kargs)  	            if(before_result != None):  	                return before_result;    	            main_result = main_func(request,kargs)  	            if(main_result != None):  	                return main_result;    	            after_result = log(request,kargs)  	            if(after_result != None):  	                return after_result;  	        return wrapper  	    return outer  	# 注意了,这里的装饰器函数有参数哦,它的意思是先执行filter函数。然后将filter函数的返回值作为装饰器函数的名字返回到这里。所以,Filter(auth,log) = outer , @Filter(auth,log) =  @outer  	@Filter(auth,log)  	def f1(name,age):  	    print("%s 正在连接业务部门1数据接口......"%name)    	# 调用方法  	f1("jack",18)