关于Python的修饰器(一)

    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*用户输入值了。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值