python中的@与__call__()函数

异常绝望,实验室事情突然多起来了,看着手里的书不知道该怎么办。

1、__call__():

这个函数要对比__new__、__init__,我的理解是这个函数写在类里面的,将类(对象)与函数的界限模糊,然后可以调用类对象的时候,可以用函数的方式赋值arg参数。


2、@的用法:

类比java的AOP(动态管理)(其实还是有点不太一样的啦,AOP更像是一种代理的类型),当在全局范围输入:

@f1
def f2():
   pass

意为立即调用f1 ( f2 () ),若为:

@f1(arg)
def f2():
   pass
意为调用f1 (arg)会返回一个函数(或一个类)然后调用f1 ( arg ) ( f2 () )


3、实例:

class myDecorator(object):

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

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

    def forTest(self):
        print ('1111')

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

print ("Finished decorating aFunction()")

aFunction()
aFunction.forTest()


输出为:

inside myDecorator.__init__()
aFunction
Finished decorating aFunction()
inside myDecorator.__call__()
inside aFunction()
1111


当执行:
@myDecorator
def aFunction():
即为 myDecoration( aFunction ) ,实例化一个类,类的 f 即为aFunction这个函数,而aFunction变为一个 myDecoration的实例,而当调用aFunction的时候,即为调用类中的__call__()方法,而__call__()又会调用(以前的)aFunction函数。

最后还尝试调用myDecoration的forTest函数,表示可以调用成功。










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值