zoukankan      html  css  js  c++  java
  • 带函数参数的装饰器(复杂装饰器)的例子

    View Code

    带函数参数的装饰器的作用就是,不用写装饰器了,写函数就行了,写函数就相当于写装饰器了。在第15行,对Index()函数进行

    装饰,此装饰器带有两个函数参数,那现在是根据python的内部语法机制传Index()函数的地址,还是传自己写的两个函数内存

    地址呢?假如没有函数地址参数,则会对Index()函数进行重新制作,把Index()函数的地址作为Filter()函数的参数传给新

    制作的Index()函数。现在,这一行(15)是这样执行的:

    1.执行Filter(before_func,after_func),把Filter()函数读到内存,函数执行就会后返回值,不写return就默认返回None.现在写的是return outer(第13行),这一步跟装饰器没关系。

    2.返回outer之后,从函数内存地址的意义上说,@Filter就变成了@outer.此时,@outer就是Index()的装饰器。outer()函数会把Index

    ()函数的地址传进来,main_func=Index.

    3.新的Index=outer()的返回值wrapper, 新Index=wrapper,它里面有传进来的两个新函数before_func()和after_func()和旧的Index()函数。

     1 def Login(request,kargs):
     2     print('此处添加新功能1,比如登陆权限检查功能。')
     3     return 33
     4 def ErrorHandle(request,kargs):
     5     print('此处添加新功能2,比如登录报错功能。')
     6 def Filter(before_func, after_func):
     7     def outer(main_func):
     8         def wrapper(request, kargs):
     9             before_result = before_func(request, kargs)
    10             main_result = main_func(request, kargs)
    11             after_result = after_func(request, kargs)
    12         return wrapper
    13     return outer
    14 
    15 @Filter(Login, ErrorHandle)
    16 def Index(request, kargs):
    17     print('此处是原来的未经装饰过的函数。')
    18     return 'home page'
    19 Index('req', 'alex')
     
  • 相关阅读:
    k8s
    vue-element-admin实现模板打印
    MAC系统命令
    思维导图工具
    前端如何渲染几万条数据不卡住页面?
    Echar使用案例
    .Net 相关报错解决方案
    Windows 操作技巧
    Docker&K8s
    微信网页授权原理分析
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/9323740.html
Copyright © 2011-2022 走看看