老了,脑子真的不好使,啥都记不住。。。
def a(func):
print('start')
func()
print('end')
@a
def b():
print('我是函数')
b
输出结果
start
我是函数
end
!没有输入,没有返回值
这样应该是最简单的修饰器了
def c(func):
def d (*args,**kwargs):
print('start')
func(*args,**kwargs)
print('end')
return d
@c
def e(word):
print('input is ',word)
e('halo')
输出结果
start
input is halo
end
!有输入,没有内层函数返回(有外层函数返回,但是没有内层函数返回)
这个修饰器接受了输入参数,所以需要双层定义,同时外层函数需要return内层函数,也就是上面的c需要返回d函数。因为如果不return d的话,执行c的时候根本就不会运行d函数部分。
def f(func):
def g (*args,**kwargs):
print('start')
func(*args,**kwargs)
print('end')
return '我是返回值‘
return g
@f
def h(word):
print('input is ',word)
print(h('halo'))
输出结果
start
input is halo
end
我是返回值
!有输入,有内外层函数返回
个人理解是f函数返回g函数,而g函数返回字符串*’我是返回值‘*。
####################################################################################
它是分割线
4.关于wraps
def i(func):
def j(*args, **kwargs):
result = func(*args, **kwargs)
return result
j.__name__ = func.__name__
j.__doc__ = func.__doc__
return j
@i
def k(a, b, c):
return (b * 2) - (a * c)
print(k(0, 6, 5),k.__name__)
7 k
def i__(func):
def j__(*args, **kwargs):
result = func(*args, **kwargs)
return result
return j__
@i__
def k__(a, b, c):
return (b * 2) - (a * c)
print(k__(0, 6, 5),k__.__name__)
7 j__
以上两段代码的差别,除了函数名,仅仅在于
j.__name__ = func.__name__
j.__doc__ = func.__doc__
这段代码的作用是让被修饰函数特性不变。也就是k函数的一些函数特性依然保持着def k中属性。而k__函数的属性已经改变成了j__的属性。
而@wraps的作用就是更简便地实现这个功能
def n(func):
@wraps(func)
def p(*args, **kwargs):
result = func(*args, **kwargs)
return result
return p
@n
def q(a, b, c):
return (b * 2) - ( a * c)
print(q(1, 6, 5))
7 q
函数q保持了自己原有的特性
#个人对@wraps(func)的理解
#@wraps(func)会使下一行的函数保持()中func函数的特性
def s():
print('我是大明湖畔的s呀')
@wraps(s)
def t():
print('我是大城市铁岭的t呀')
t()
print(t.__name__)
#执行结果
我是大城市铁岭的t呀
s
#@wraps使得t函数拥有s函数的一些特性
更深层次的原理还不了解,目前好像就这些😂
不想当码农了,头发好香😭