异常绝望,实验室事情突然多起来了,看着手里的书不知道该怎么办。
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函数,表示可以调用成功。