# coding:utf-8
"""
作用:
原理:闭包 >> 1. 函数内部定义函数
2.内部函数使用外部函数的变量
3.外部函数返回内部函数的引用
带参数的函数装饰器 》》 三层 类的装饰器 >> 解决self 参数的问题
>> 被装饰的对象是类不是函数
""" def method_decorator(decorator, name=''):
print("类装饰器执行了") def _dec(cls):
print("真正的类装饰器生成了,并执行了")
is_class = isinstance(cls, type)
if is_class:
method = getattr(cls, name)
else:
raise Exception("该装饰器只用来装饰类") def _wrapper(self, *args, **kwargs):
@decorator
def bound_func(*args2, **kwargs2):
return method(self, *args2, **kwargs2) return bound_func(*args, **kwargs) setattr(cls, name, _wrapper)
return cls return _dec def my_decorator(bound_func):
print("函数装饰器执行了") def real_func(*args, **kwargs):
print("\nexc decorator code before func\n")
ret = bound_func(*args, **kwargs)
print("\nexc decorator code after func\n")
return ret return real_func """
@method_decorator(decorator=my_decorator, name="get")
ViewTemp = method_decorator(decorator=my_decorator, name="get")(ViewTemp)
ViewTemp = _dec(ViewTemp)
>>> ViewTemp.get = ViewTemp._wrapper
""" @method_decorator(decorator=my_decorator, name="get")
class ViewTemp:
def get(self, request):
print("-----this is get method-----", "\nrequest==", request) def post(self, request):
print("-----this is post method----") if __name__ == '__main__':
"""
ViewTemp().get(request="xixixi)
ViewTemp()._wrapper(request="xixixi)
>>> _wrapper(self, request="xixixi)
>>> >>> @decorator my_decorator(bound_func)
>>> >>> def bound_func(*args2, **kwargs2): bound_func = real_func
return method(self, *args2, **kwargs2)
return bound_func(*args, **kwargs)
>>> real_func(request="xixixi)
>>> >>> print("\nexc decorator code before func\n")
>>> >>> ret = bound_func(request="xixixi") >> bound_func(request="xixixi") >> method(self, request="xixixi)
>>> >>> print("\nexc decorator code after func\n")
>>> >>> return ret """
ViewTemp().get(request="xixixi")
pass

@method_decorator() 源码解析的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  5. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  6. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  7. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  8. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  9. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

随机推荐

  1. RabbitMQ使用介绍及实例

    消息列队不做过多解释了,直接讲讲rabbitmq的基本概念和路由模式. 一.安装及基本概念 rabbitmq是基于erlang编写的,所以安装rabbitmq之前需要安装erlang的环境,配置环境变 ...

  2. HDU5616 天平能否称出物体重量问题 01背包变形或者折半搜索

    //hdu5616 void solve1(){dp[0]=1;for(int i=1;i<=n;i++){for(int j=INF;j>=val[i];j--){dp[j]|=(dp[ ...

  3. Delphi xe8 FMX StringGrid根据内容自适应列宽。

    Delphi xe8 FMX StringGrid根据内容自适应列宽. 网上的资料比较复杂,而且不是根据字体字号等设置列宽.故自己写了个function来用. function GetColMaxDa ...

  4. CSS-精灵图片的使用(从一张图片中截图指定位置图标)

      一.名词解释 在网页中,我们可以看到有很多的小图标,比如微博上的登录位置有很多这样的小图标.因为浏览器显示网页的所有内容都需要从我们自己的服务器进行下载,如果将这些图标分别存在服务器上,那么当需要 ...

  5. Beanshell断言

    Beanshell断言示例一:通过从数据库查询结果集,和从接口返回中解析json格式的返回内容,比较两者来验证sample请求是否成功 1>先通过JDBC PreProcessor把测试计划中所 ...

  6. SQL-记录查询篇-009

    在学习记录查询之前,学习一些关键字的使用: 1.逻辑运算符:and . or . not  .is null select * from   table_name where  id>2 and ...

  7. 19/03/15Pyhon笔记

    1.快速在python中显示目标的2进制写法 bin(342) "0b101010110" 2.一个二进制位就是一比特(bit) 3.Python2默认无法识别中文,需要加文件头 ...

  8. java.io.EOFException ValueOperations.increment()操作后,获取值时有的bug

    ---恢复内容开始--- 今天使用spring-data-redis包操作redis,就是简单的使用redis的计数功能,在redis中的操作命令如:incr key;get key; 这两步操作使用 ...

  9. [Java] 例外處裡 try/catch & throws

    public class CheckException { public static void main(String[] args) { File file = new File("xx ...

  10. Discuz! X3 全新安装图文教程

    Discuz! 是腾讯旗下 Comsenz 公司推出的以社区为基础的专业建站平台,帮助网站实现一站式服务.让论坛(BBS).个人空间(SNS).门户(Portal).群组(Group).应用开放平台( ...