修饰器小笔记

老了,脑子真的不好使,啥都记不住。。。

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函数的一些特性

更深层次的原理还不了解,目前好像就这些😂
不想当码农了,头发好香😭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值