Python装饰器的使用
对于python编程人员,装饰器的使用肯定是必不可少的。
装饰器分为系统定义装饰器和自定义装饰器;系统定义装饰器:@classmethod:类方法装饰器 @staticmethod: 静态方法装饰器 @property修饰的方法是属性方法,属性方法被调用时不需要在方法后加括号 详细请参考python内置装饰器的使用。
装饰器的本质就是一个函数,作用是在不改变源代码的情况下,给函数增加额外的功能;装饰器的使用通过@语法糖进行调用
自定义装饰器又分为:带参的装饰器和不带参的装饰。
先来说不带参的装饰器:
# 1.声明一个普通的装饰器
# 需求:获取每个函数的运行时间
import datetime,time def get_func_time(func): # 外层作为装饰函数,必须接收参数,将被装饰函数传入
def inner(*args): # 内层实现被装饰函数的额外功能,如果被装饰函数需要传入参数,可以定义不定长参数:*args,或者关键字参数:**kwargs
start_time = datetime.datetime.now() # 获取当前时间,作为开始时间
result = func(*args) # 调用传入的被装饰的函数,传入需要的参数
end_time = datetime.datetime.now() # 获取当前时间,作为结束时间
print('程序的运行时间为:', end_time - start_time)
return result # 如果被装饰函数是有返回值的,在此也应该将结果进行返回
return inner # 必须将内层函数对象返回,如果不返回会报:typeError @get_func_time
def program(): #该函数不需要传入参数
# 被装饰函数,实现休息三秒
time.sleep(3)
# 调用函数:
program()
程序的执行结果

@get_func_time
def get_max_common_divisor(num1,num2): # 这是一个需要传入参数的函数
'''
求两数的最大公约数
'''
max_common_divisor = 0
min_num = min(num2,num1)
for i in range(1,min_num+1):
if num1 % i == 0 and num2 % i ==0:
print('这是一个公约数:',i)
max_common_divisor = i
return max_common_divisor
# 调用函数:
get_max_common_divisor(20, 10)

然后我们写一个带有参数的装饰器:
# 需求实现打印不同花边的姓名 # 如果需要声明一个带有参数的装饰器,则需要嵌套三层函数,最外层进行选择判断。
def decorator(choice):
if choice == '*':
def out(func):
def inner(*args):
print('**********')
func(*args)
print('**********')
return inner
return out
elif choice == '-':
def out(func):
def inner(*args):
print('----------')
func(*args)
print('----------')
return inner
return out
else:
def decorator(func):
def inner(*args):
print('%%%%%%%%%%')
func(*args)
print('%%%%%%%%%%')
return inner
return decorator @get_func_time # 调用装饰器使用:@装饰器名称 # 一个函数可以调用多个装饰器
@decorator(choice='-')
def get_name(name):
# 源代码:打印姓名
print(name) get_name('刘德华')

除了可以声明函数装饰器还可以声明一个类装饰器;如果要声明一个类装饰器必须实现__call__方法;__call__方法的使用参考下方
# 不带参数的类装饰器类装饰器
import time,datetime
class class_decorator(): def __init__(self,func): # __init__方法用于接收传入的函数
self.func = func def __call__(self, *args, **kwargs): # call方法则相当于函数装饰器的内层函数
start = datetime.datetime.now()
self.func()
end = datetime.datetime.now()
return end - start
@class_decorator
def programs():
print('程序开始')
time.sleep(3)
print('程序结束') program_time = programs()
print('程序运行时间为:',program_time)

# 带参数的类装饰器
class decorator(): def __init__(self,language): # init 方法接收的不在是传入的函数,接收的是参数
self.language = language def __call__(self,func): # 函数通过call方法传入
if self.language=='中文': # 执行判断
def inner(*agrs,**kwargs):# 内层函数增加功能
name = func(*agrs)
return '你好' + name
return inner
elif self.language == 'English':
def inner(*agrs, **kwargs):
name = func(*agrs)
return 'Hello\t' + name
return inner @decorator('English')
def aaa(name):
return name name = aaa('张三')
print(name)

补充:__call__方法的使用;__call__ 方法实现将类实例变成一个可以调用的函数
class B():
def __init__(self):
print('这是初始化方法') def __call__(self):
print('这是call方法') b = B()
b()

Python装饰器的使用的更多相关文章
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
随机推荐
- MyBatisCodeHelper-Pro插件破解
MyBatisCodeHelper-Pro: MyBatisCodeHelper-Pro是IDEA下的一个插件,功能类似mybatis plugin. 但是是收费的,我们可以对他进行破解 转载出处:h ...
- Leetcode(9)回文数
Leetcode(9)回文数 [题目表述]: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 第一次:直接全部转 执行用时:148 ms: 内存消耗:13.4 ...
- Yii ActiveRecord用法记录备忘
ActiveRecord 使用方法 Example1 in查询 $criteria = new CDbCriteria(); $criteria->select = $select; $crit ...
- SpringCloud之Eureka服务注册与发现(一)
一 Eureka的基本架构 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构 ...
- 【python3基础】命令行参数及 argparse
目录 命令行参数及 argparse 包 argparse 传递 bool 参数错误做法 argparse 传递 bool 参数正确做法 1 argparse 传递 bool 参数正确做法 2 Ref ...
- Mycat分布式数据库架构解决方案--Linux安装运行Mycat
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Myc ...
- SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列
分享一道今天的面试题:SQL语句实现:数据库中有A B C三列,当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列 第一种:使用case when...then...else ...
- 前端技术之:Prisma Demo服务部署过程记录
安装前提条件: 1.已经安装了docker运行环境 2.以下命令执行记录发生在MackBook环境 3.已经安装了PostgreSQL(我使用的是11版本) 4.Node开发运行环境可以正常工作 ...
- git log 附加命令归纳
git查看历史记录的时候查看每次提交的内容差异: git log -p git限制显示的条数 : git log -p -2 [-2] git简单显示每次提交做了哪些改动: git log --sta ...
- MIT线性代数:1.方程组的几何解析