python中的@,,copy frome
python中的@,,copy frome
copy frome:https://blog.csdn.net/weixin_42205776/article/details/89333359
一、函数修饰符
‘@‘ 用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,
出现在函数定义的前一行,不允许和函数定义在同一行
一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西?
要了解python中@装饰器的作用,首先要记住这么几点:
1. 装饰器符号“@”属于语法糖,什么意思呢?就是说,我不按照@装饰器的语法要求来写,而是按照一般python的语法要求来写完全可以。那么用@装饰器的格式来写的目的就是为了书写简单方便
2. 装饰器的作用是什么呢? 简单的理解就是:装饰原有的函数。什么意思呢?比如有一个函数func(a, b),它的功能是求a,b的差值,我现在有一个需求,就是想对函数功能再装饰下,求完差值后再取绝对值,但是不能在func函数内部实现,这时候就需要装饰器函数了,比如func = decorate(func)函数,将func函数作为参数传递给decorate函数,由decorate来丰富func函数,丰富完成后再返回给func,此时func的功能就丰富了。
3.python的常识,函数和其他任何东西一样,都是对象。这意味着可以将函数当做实参传递给函数,或者在函数中将函数作为返回值返回。例码验证:
>>> def add(x, y):
...return x + y
>>> def sub(x, y):
...return x - y
>>> def apply(func, x, y): # 1
...return func(x, y) # 2
>>> apply(add, 2, 1) # 3
3
>>> apply(sub, 2, 1)
1
了解上述观点后,可以先不用@符号来写一个简单的装饰器
对于sub = decorate(sub)的理解。最终会将inner的值传给sub ,此时执行sub(3, 4),其实是执行decorate中的inner,所以为1.
那么为了书写方便,将sub=decorate(sub)换为@decorate,并放在sub的定义面前,即:
@decorate
def sub(a, b):
return a-b
只是书写不同,结果相同。
示例2:
1 def square_sum(fn): 2 def square(*args): 3 print "1---", args 4 n = args[0] 5 # return n*(n-1)*(2*n-1)/6 6 print "2==", n*(n-1)*(2*n-1)/6 7 print fn.__name__ 8 fn(n*(n-1)*(2*n-1)/6) 9 print "*"*1510 return fn(n*(n-1)*(2*n-1)/6)11 return square12 13 14 @square_sum15 def sum_a(a):16 print "3=", a17 18 sum_a(10)
结果
1 2 3 4 5 6 | 1---(10,) 2==285 sum_a 3=285 *************** 3=285 |
可以看出,他是先执行修饰器函数,然后有return fn的时候,修饰器下的函数才是生效的,否则函数sum_a 是没有结果的。
python中的@
相关内容
- 一道Python面试题:给出d = [True, False, True, False, True],请
- Python将某文件夹及其子文件夹下某种格式的文件移动到
- Python文件打开方式详解——r,w,a,r+,w+,a+,,r,r+,w,w+,
- 国内的python仓库源,,阿里云 https:
- Python几个有趣和特别的小故事,,前言当一门编程语言是
- python 2 与 python 3 —— 转义及编码(\u \x),,首先前面
- Python 字符串格式化%与format() 函数 九,,这是12月规划的
- 关于python脚本头部设置#!/usr/bin/python,,今天又是贼几把
- python习题,,使用二维数组输出不同
- python pyd 鍔犲瘑鐩稿叧,,鏍囩锛?a hre
评论关闭