python装饰器语法糖_Python高级语法-装饰器(Python语法糖)

装饰器

以前看到有趣的对话。python

面试官:会python?面试

面试者:嗯。函数

面试官:谈谈装饰器。code

面试者:额,我没有用过,,,blog

其实在不少开源项目中咱们均可以看到装饰器的影子。内存

高阶函数

在python语言中,参数含有函数名的函数称之为高阶函数。(此时调用的函数不加参数,也就是说没有括号紧跟)class

装饰器是什么

在不改变源代码的基础上扩展函数须要的新需求,这就是装饰器。(不改变函数源代码,这也是装饰器最基本的原则)基础

装饰器,它自己也就是一个函数,应用高阶函数实现。扩展

使用时通常把被装饰的函数的内存地址当参数传入装饰器函数体,经过参数调用被装饰的函数,得到或者修改其属性。方法

装饰器的使用

通常认为,装饰器使用遵循必定格式,即:高阶函数+高阶函数内嵌套函数。

假设有一个需求,我要知道正在运行什么函数,在运行时输出。

有一个比较粗暴的方法。

def func1():

print(func1.__name__)

pass

def func2():

print(func2.__name__)

pass

def func3():

print(func3.__name__)

pass

if __name__ == '__main__':

func1()

func2()

func3()

这必定是对的,可是不天然就想到两个字“封装”,虽然这和装饰器截然不同,可是两个概念确实有相通之处。

按照装饰器原则,能够这样写。

def funcname(func):

def out():

func()

print(func.__name__)

return out

@funcname

def func1():

pass

@funcname

def func2():

pass

@funcname

def func3():

pass

if __name__ == '__main__':

func1()

func2()

func3()

结果是,咱们确实实现了这个功能。

755457d21caf5582ae1fc971cf7a1a61.png

装饰器的进一步使用

在以前的这个小实验中,基本上了解了装饰器的用途和写法,然而不是全部的函数都想func1这样简单,无参数。

对于含不定参数的函数,参数由收集参数获取。

def funcname(func):

def out(*args, **kwargs):

func(*args, **kwargs)

print(func.__name__)

return out

@funcname

def func1(a, b):

print(a+b)

@funcname

def func2(a, b, c):

print(a+b+c)

@funcname

def func3(a, b, c, d):

print(a+b+c+d)

if __name__ == '__main__':

func1(1, 2)

func2(1, 2, 3)

func3(1, 2, 3, 4)

2ccc4301160ad286d2fd2bdc22518f56.png

装饰器的多重使用

不一样的装饰器是能够给同一个函数装饰的,会从最后一个装饰器开始执行到第一个装饰器,再执行函数自己。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值