Python3学习笔记(一):关于装饰器的操作思路

    学习Python也有一段时间了,但是一直没有写过笔记,因为总觉得有点不得要领,今天开始写下第一篇关于Python的笔记,将一些自己的理解记下来,为我这个健忘的脑子留个后路。

    以前一开始自学Python的时候就对装饰器感觉很迷茫,算是我在学Python上遇到的第一个坎,而且也找不到人解惑,就一直耽搁,慢慢的遗忘了,直至现在,重新拿起Python后,开始有了新的理解,这里的理解完全是根据很多次的测试总结出来的一套适合自己去记住这个装饰器的思路,正真意义上可能并不是很准确。

    装饰器,我一般叫修饰器会觉得顺口点。我记了一段代码,用来让笔记更详细点。

def decorate( fn):
def fb():
print( 'test 1')
def fx( a, b = 1):
pass
fn(a,b)
fb()
print(a,b)
return fx

@decorate
def call( a1, b1):
print(a1,b1)

call( 2, 3)

    这段程序里面,做为使用者调用call函数,并给出两个实参2和3,按照我以前写程序的思路,我并不会先看函数的内部,而是等到调用的时候,把实参带入到函数中去,然后一步一步的运算处理,最后得出结果,就是这样的思维让我在遇到修饰器的时候直接宕机,而且我记得我从来没在写C的时候用到过修饰器或者类似修饰器一样的东西,果然还是太孤陋寡闻了。修饰器含糊是

    Python中用到修饰器是,我总结出一种思路用来理解这个东西的用法,首先,在将实参传给函数的时候,先确定这个函数是不是一个很‘普通的’函数,比如这个call函数就是一个外面有一个修饰器decorate的函数,那么先应该把这个call函数用修饰器处理下,思路如下。

    1.直接查看修饰器的返回函数,就是上面的return  fx

    2.这个返回的fx是一个函数对象,没有加()所以不会执行,这个返回的fx会替代掉原来的call函数,然后再看fx函数,它定义在修饰器函数里面,里面除了一个pass之外有三个语句,fn调用,fb函数调用,print语句。

    3.其中fn函数被定义在fx的上一级的作用域内,也就是修饰器的作用域,而且它是修饰器的形参,这个fn绑定的就是被修饰器修饰的那个函数call,进过这一次传参后,call整个函数被打包传入修饰器,并且经过传参换了个身份被安放在修饰器将要返回的函数里面,这里就起到了修饰器的存在的意义,它将原函数的功能返回了,而且它还加入了其他的语句

    4.fb函数就是修饰返回的函数里面除了原函数加的第一个额外的功能,它被定义在修饰器内部,打印一个test1,证明它起到了作用,

    5.最后在输出一个print(a,b),这里要注意的a和b是参数,这个两个参数被定义在将要返回的fx的形参列表里面,我一开始也是在思维上的问题一直被这个两个形参列表为难,这里直的我注意和谨记的就是这个这个fx的形参列表是和用作操作的call函数时给传入的实参是相对应的,应为这个时候call给出的2和3已经不会再传给call原函数了,而是传给了修饰器返回的fx函数,所以他们的形参和实参应该一一对应,可以理解成call原函数被加工了,传给加工后的值可以变得更多或者更少。

    6.但是值得注意的是,在返回的fx函数内部的fn函数,因为它其实是原函数call改头换面来的,所以它就是原来的call函数,给它安排的实参要根据原call函数的形参列表来。

    7.最后在打印a和b连个值,这个函数的运行结果是,先打印2  3,然后是test 1,然后再打印一个2  3

    8.这个时候我如果改了一下程序,改成下面这样,调用的时候多给出个实参4,从表面上来看,call原函数的形参列表只有两个,但是我给了三个实参,应该会报错的才对,实际上并不会,以为我把修饰器返回的函数也改成3个形参了,这里打印的结果是2  3,然后是test 1 然后是2  3  4。

def decorate( fn):
def fb():
print( 'test 1')
def fx( a, b, c):
pass
fn(a,b)
fb()
print(a,b,c)
return fx

@decorate
def call( a1, b1):
print(a1,b1)

call( 2, 3, 4)

    vscode软件会在call函数调用的时候来个小警告,是关于形参与实参的问题,但是并不影响程序运行,看样子我被程序没有error就算有10k个warning也ok的思想毒害的很深了,以前写C那是很强迫症的,编译后一个warning都不能有的。

    我总结的这些里面,我觉得最重要的就是这个形参和传参的问题,我也是在这个上面纠结了好久,不过结果是好的,以前用来学习和理解程序的思考方式突然就不适用了,然后纠结了半天,终于想明白,有一番新的体会。

    虽然这只是一个小小的细节,但是对于后面学习面向对象非常有用的,我终于体会到换个角度和思路去考虑代码运行的那种感觉,虽然只有短短的几行代码,但这对我来说这是一种思维上的转变,从面向过程到面向对象,语言是死的,套路是死的,只有思维是活的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值