1. 类装饰器(都不带参数)

class ClassDeco:

def __init__(self, func):

self.func = func

def __call__(self, *args, **kwargs):

print(f'Running {self.func.__name__}')

self.func()

print(f'End {self.func.__name__}')

@ClassDeco # 等价于 foo = ClassDeco(foo)

def foo():

print('do something')

# call foo()

# OUT:

# Running foo

# do something

# End foo

2. 类装饰器带参数

class ClassDeco:

def __init__(self, x, y):

self.x = x

self.y = y

def __call__(self, func, *args, **kwargs):

print(f'Running {func.__name__}')

print(f'Using x + y = {self.x + self.y}')

return func

@ClassDeco(1, 2) # 等价于 foo = ClassDeco(1, 2)(foo)

def foo():

print('do something')

# call foo()

# OUT:

# Running bar1

# Using x + y = 3

# do something

3. 类装饰器不带参数,被包装对象带参数

class ClassDeco:

def __init__(self, func):

self.func = func

def __call__(self, *args, **kwargs):

print(f'Running {self.func.__name__}')

self.func(*args, **kwargs)

print(f'End {self.func.__name__}')

@ClassDeco # 等价于foo = ClassDeco(foo)

def foo(a, b):

print('do something')

print(f'return a + b = {a + b}')

# foo(1, 2)

# OUT:

# Running foo

# do something

# return a + b = 3

# End foo

4. 类装饰器带参数且被装饰对象也带参数

from functools import wraps

class ClassDeco:

def __init__(self, x, y):

self.x = x

self.y = y

def __call__(self, func, *args, **kwargs):

print(f'Using x + y = {self.x + self.y}')

@wraps(func)

def wrapper(*args, **kwargs):

func(*args, **kwargs)

print(f'Ending {func.__name__}')

return wrapper

@ClassDeco(1, 2) # 等价于 foo = ClassDeco(1, 2)(foo)

def foo(a, b):

print('do something')

print(f'return a + b = {a + b}')

# call foo(3, 4)

# OUT:

# Using x + y = 3

# do something

# return a + b = 7

# Ending foo

if __name__ == '__main__':

foo(3, 4)

5. 参考

python类装饰器详解-Python 类装饰器解析相关推荐

  1. 机器学习:基于概率的朴素贝叶斯分类器详解--Python实现以及项目实战

    前言 前篇基础理论知识:机器学习:贝叶斯分类器详解(一)-贝叶斯决策理论与朴素贝叶斯 这篇主要使用代码实现贝叶斯分类. 一.准备数据 创建一个bayes.py程序,从文本中构建词向量,实现词表向向量转 ...

  2. python归一化处理_详解python实现数据归一化处理的方式:(0,1)标准化

    在机器学习过程中,对数据的处理过程中,常常需要对数据进行归一化处理,下面介绍(0, 1)标准化的方式,简单的说,其功能就是将预处理的数据的数值范围按一定关系"压缩"到(0,1)的范 ...

  3. python namedtuple用法_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  4. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

  5. python列表拆包_详解python 拆包可迭代数据如tuple, list

    详解python 拆包可迭代数据如tuple, list 拆包是指将一个结构中的数据拆分为多个单独变量中. 以元组为例: >>> a = ('windows', 10, 25.1, ...

  6. python 减法函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?

    大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章.在本文中,我想谈谈二元算术运算. 具体来说,我想解读减法的工作原理:a - b.我故意选 ...

  7. python操作目录_详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...

  8. python如何安装matplotlib_详解python安装matplotlib库三种失败情况

    (可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...

  9. python模式匹配算法_详解Python 最短匹配模式

    问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...

  10. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

最新文章

  1. H5用户地址位置选择地点获取经纬度(效果图)
  2. Kubernetes删除一直处于Terminating状态的namespace
  3. session 存放对象变量,及遇到的奇怪现象
  4. php unable to save,php – Laravel save()未定义
  5. NLP基础:n-gram语言模型和神经网络语言模型
  6. 五个常用的Linux监控脚本代码
  7. CNN框架的搭建及各个参数的调节
  8. mysql sql 片段_MySQL代码片段
  9. 可能存在无限递归_你为什么学不会递归?读完这篇文章轻松理解递归算法
  10. [编程手记小技巧]自定义调试信息宏及gcc技巧
  11. 做好准备,让你的短信应用迎接Android 4.4(KitKat)
  12. Linux系统TTY串口驱动实例详解
  13. python | prophet的案例实践:趋势检验、突变点检验等
  14. 支付宝小程序: h5跳转 小程序
  15. php guzzle 上传文件,Guzzle 使用文档
  16. 怎样从旧版本激活TeamViewer新版本界面?
  17. Linux操作系统安全(一)
  18. uml各类图--完整全面实例
  19. 理想照进现实:大量AI项目未见收益,产业方渐归冷静
  20. c++ promer和c++ primer Pluse下载

热门文章

  1. MySQL_控制台操作_01
  2. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)
  3. 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 有损脑健康的七种坏习惯...
  4. 面试集——redis
  5. 虚拟化技术中,为什么说容器技术暂时将不会取代虚拟机模式
  6. Python3之redis使用
  7. JavaScript 公有 私有 静态属性和方法
  8. 无线AP与无线交换机的区别
  9. c#中反射技术在Unity中的运用
  10. ActiveMQ 入门