python中@的一个用法(装饰器)

之前写代码遇到一个函数的上一行有格式为

@函数名

因此做了一些学习,这玩意叫装饰器,它用来装饰一个函数,装饰器fun1(),参数必须是函数名,返回值也必须是一个函数!!!

在Python中允许函数名作为另一个函数的参数,即fun1(fun2),注意不能写成fun1(fun2())。

从下面的例子当中可以看到,fun2()和fun3()两个函数体内容差不多,一个用了装饰器,一个用了函数嵌套调用,结果也类似。

其中代码段

@fun1         

def fun2():

    print("function2")

相当于 fun1(fun2) 函数嵌套调用,

或者说,相当于   fun2 = fun1(fun2),还记得刚刚说过的吧,fun1()返回值是一个函数,所以fun1(fun2)的结果赋值给fun2,fun2依旧是一个函数,只是此时已经被装饰过了。

def fun1(funname): #这个funname是一个函数的名字,函数名字作为另一个函数的参数
    print("initial function")
    return funname()            #也可以不用写返回值,直接funname()也行


@fun1           # 相当于 fun1(fun2) 函数嵌套调用
def fun2():
    print("function2")

def fun3():
    print("function3")

print("分割线---------------")

fun1(fun3)  #不能写成fun1(fun3()) 

结果:

initial function
function2
分割线---------------
initial function
function3

注:return funname() 不要写成 return funname !!!要加括号

 

下面说一下 类装饰器

下面内容转载自:https://mp.weixin.qq.com/s/98JA68TX9X4j6wPABiMJNA

请移步原文

class myDecorator(object):

    def __init__(self, func):
        print "inside myDecorator.__init__()"
        self.func = func

    def __call__(self):
        self.func()
        print "inside myDecorator.__call__()"

@myDecorator
def aFunction():
    print "inside aFunction()"

print "Finished decorating aFunction()"

aFunction()

# output:
# inside myDecorator.__init__()
# Finished decorating aFunction()
# inside aFunction()
# inside myDecorator.__call__()

我们可以看到这个类中有两个成员:

  1. 一个是__init__(),这个方法是在我们给某个函数decorator时被调用,所以,需要有一个func的参数,也就是被decorator的函数。

  2. 一个是__call__(),这个方法是在我们调用被decorator函数时被调用的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值