装饰器:不改变原函数的基础上,给函数增加功能的方式,称为装饰器 
即:为已经存在的对象添加额外的功能
装饰器其实就是一个闭包,把一个函数当做参数后返回一个替代版的函数 decos.py:
(装饰器的参数类)代码如下:
class Locker1:
def __init__(self):
print('locker1...') @staticmethod
def acquire():
print('locker1 acquire...') @staticmethod
def unlock():
print('locker1 unlock...') class Locker2(Locker1):
@staticmethod
def acquire():
print('locker2 acquire...') @staticmethod
def unlock():
print('locker2 unlock...')
 

装饰器函数 和 主程序:

# 装饰器函数:

def locker_deco(cls):
def _deco(func):
def __deco(*args,**kwargs):
print('before...')
print(func.__name__)
cls.acquire()
try:
return func(*args,**kwargs)
finally:
cls.unlock()
print('after...')
return __deco
return _deco # 主程序: from decos import Locker1,Locker2 class Example:
@locker_deco(Locker1)
def func1(self):
print('func1...')
return 5 @locker_deco(Locker1)
@locker_deco(Locker2)
def func2(self,a,b):
print('func2...')
return a+b e=Example()
e.func2(1,2)
print('****')
print(e.func2(1,2))

运行结果:

before...
__deco
locker1 acquire...
before...
func2
locker2 acquire...
func2...
locker2 unlock...
locker1 unlock...
****
before...
__deco
locker1 acquire...
before...
func2
locker2 acquire...
func2...
locker2 unlock...
locker1 unlock...
3
 

装饰器带类参数 & 一个函数应用多个装饰器的更多相关文章

  1. 【c++】类中带默认参数的函数

    反思两个问题 1. 带默认参数的函数,为何声明.定义不能同时有参数? 2. 带默认参数的函数, 为何带默认参数的参数靠后站? 上程序 #include <iostream> #includ ...

  2. python 装饰器--对有无参数的函数进行装饰

    # 使用装饰器无参数的函数进行装饰# def func(funcionName): # print('-----1------') # def func_in(): # print('--func_i ...

  3. C/C++中带可变参数的函数

    1.带可变参数的函数由来 当函数中的参数个数不确定时,这时候就需要带可变参数的函数! 如我们经常使用的C库函数printf()实际就是一个可变参数的函数, 其原型为: int printf( cons ...

  4. python四个带 key 参数的函数(max、min、map、filter)

    四个带 key 参数的函数: max()点击查看详细 min()点击查看详细 map()点击查看详细 filter()点击查看详细 1)max(iterable, key) key:相当于对可迭代对象 ...

  5. php课程 3-12 带默认参数的函数怎么写

    php课程 3-12 带默认参数的函数怎么写 一.总结 一句话总结:多看学习视频啊 1.带默认参数的函数怎么写? 直接等于号接默认参数,和js里面一模一样 2.带默认参数的函数的注意事项是什么? 默认 ...

  6. js课程 2-7 带默认参数的函数怎么写

    js课程 2-7 带默认参数的函数怎么写(注意参数顺序) 一.总结 一句话总结:默认参数一定要放在最后面,而且还有注意你调用参数的时候给参数的顺序习惯.直接加个等于号就可以是默认参数.function ...

  7. Python练习笔记——编写一个装饰器,测算出一个函数的运行时间

    import time def time_value(dec): def wrapper(*args,**kwargs): start_time = time.time() get_str = dec ...

  8. 大半宿,封装了一个MP3播放器的类,写了个简陋的播放器

    用 winmm.lib 写的 封装不是很好,而且没有优化,效率可能有问题,但是现在几乎没有什么大问题 我用我封装的类,写了一个小播放器,界面上的所有功能都实现了,包括双击列表中的文件名,直接播放文件 ...

  9. python 定义带默认参数的函数

随机推荐

  1. maven 私服上有jar包但是却下载不下来

    解决办法: 在parent中执行deploy命令就解决了. 原因:第一次建项目,上传jar包的时候直接进入到该项目中进行deploy到私服.最终发现私服仓库有,但是别人引用的时候无法下载.是因为别人下 ...

  2. mysql查询列定义,是否自增等

    SELECT ORDINAL_POSITION AS Colorder, Column_Name AS ColumnName, data_type AS TypeName, COLUMN_COMMEN ...

  3. String.format()详细用法

    String.format()字符串常规类型格式化的两种重载方式 format(String format, Object… args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字 ...

  4. phpexcel中文手册(转)

    首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...

  5. Python3基础 二、八、十、十六进制数的定义

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  6. Learning Face Age Progression: A Pyramid Architecture of GANs-1-实现人脸老化

    Learning Face Age Progression: A Pyramid Architecture of GANs Abstract 人脸年龄发展有着两个重要的需求,即老化准确性和身份持久性, ...

  7. shell中跳出循环语句break和continue

    在使用while或for循环语句过程中,也许碰到某个特殊条件,我们需要跳过当次循环或整个循环,这是就需要借助break和continue. break表示跳出本层循环,break n表示跳出循环的层数 ...

  8. jenkins部署集群

    环境: 两台Centos7.3系统 master:172.16.1.227 slave:172.16.1.228 其中一台作为master,另一台为slave(slave服务器上无需安装jenkins ...

  9. Jenkins配置发送邮件步骤

    Jenkins配置邮件步骤,以下我是以腾讯企业邮箱账号作为演示 1.配置Jenkins系统管理员邮件地址: 下拉找到以下位置 2.配置邮件通知 继续下拉,找到邮件配置.输入SMTp服务器以及邮箱后缀, ...

  10. [LeetCode] 274. H-Index H指数

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...