关于Python的修饰器(一)

系统 1345 0

    Python对于将函数作为参数传递给另一个函数调用是非常方便的,只要你在函数中将调用的参数按照函数处理进行调用,这种操作就能顺利完成。如:

   def S(n):

          sum=0

          for i in range(n): sum+=i

          return sum

 

   def P(f):

          a=eval(input('输入一个数'))

          print('数的累加为:'f(a))

    运行P(S),即能够从键盘获得输入并打印出结果。这里将函数S作为参数传递给P是非常方便的。而在P中,之所以将参数f认为是函数,则是因为对它的使用是按照函数进行的。

    在Python中,修饰器是C++等其它语言中没有的新特性,通过修饰器的定义,可以对一个对象在其外部通过修饰器对其进行修改,而不用修改这个对象本身。如下:

   def myDec(f):                      #定义一个函数,该函数以另一个函数f作为参数

          if(f()>=5): lambda:return f()*2

          else: return lambda:f()

 

   @myDec                                   #定义一个下面的Hello对象的myDec修饰器

   def Hello():

          return eval(input('输入一个数'))

    在上面的例子中首先定义了一个函数myDec,函数接收一个函数参数。该函数就可以被修饰器作用用来修饰其它函数对象了。

    下面定义了一个函数Hello,该函数将myDec作为修饰器。当修饰器定义完成后,Python解释器会自动调用函数Hello并将修饰器作用于Hello,即相当于进行了如下表达式的函数调用:

    Hello=myDec(Hello)

    其结果是把函数myDec中的效果施加在了函数Hello之上。在本例中,如果用户输入的数大于等于5,最后形成的Hello函数实际上是对原Hello函数乘以2,否则就是原Hello函数,从而在没有修改Hello的基础上完成了对Hello的修改或者修饰。

通过这个例子我们可以注意有以下几个要点:

  1. 对被修饰对象的修改和修饰是由修饰器函数完成的(本例中的myDec),该函数由于要对被修饰对象进行修饰,所以应该首先定义,并接收一个被修饰对象参数,以便完成对该对象的修饰;
  2. 如例子中所表达的,修饰器实际完成的是被修饰对象通过修饰函数进行修饰的操作,即如例子的Hello=myDec(Hello),所以修饰函数的返回值最终将作用于被修饰对象。所以从逻辑上讲,修饰器函数应该返回与被修饰对象相同的对象,如例子中通过无名函数返回的依然是相类似的函数。当然,理论上讲,修饰器函数完全可以返回其它任何类型的对象,当然这样的结果实际上就完全修改了被修饰对象,所以一般不要这么做,以免发生不可预料的结果;
  3. 修饰器只在定义完成后立即执行,所以其修饰作用会立刻发生,之后只要没有重新运行修饰器定义,该作用会保持不变。如例子中函数Hello从键盘接收并返回一个输入。当修饰器定义完成后,Python编辑器会立即运行修饰器,并通过修饰函数调用被修饰函数Hello,要求用户提供一个输入。这时如果用户输入大于等于5,这时Hello函数会被修饰为返回2*用户输入的值,之后如果再次运行函数Hello,不管用户输入是否大于等于5,都会返回2*用户输入值了。

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论