装饰器,又名函数修饰符。笔者觉得函数修饰符,这个名字更能直观的反应他的作用。
函数修饰符语法特征 :
@ + 修饰符
函数修饰符的装饰对象:
函数修饰符,就是说他修饰的是函数,而不是其他的东西,不是类,也不是变量,就函数而已!
修饰符本身可以是哪些东西:
1、函数标签(C/C++的说法:函数指针)
2、带有魔法方法__call__() 的类的类名
3、Ptyhon内置修饰符
修饰符的本质:
一个可以接受函数作为参数的函数
函数修饰符的工作原理:
当一个函数被一个修饰符修饰之后,再次调用该函数时,该函数会作为一个参数传入该修饰符。结果是该修饰符返回的函数被调用
1、修饰符为函数标签(C/C++的说法:函数指针)的例子:
import time def timeslong(func): def call(): start = time.clock() print("It's time starting ! ") func() print("It's time ending ! ") end = time.clock() return "It's used : %s ." % (end - start) return call @timeslong def f(): y = 0 for i in range(10): y = y + i + 1 print(y) return y print(f())
总结:当修饰符为函数便签时,注意该函数必须返回的是一个函数便签。因为,修饰符的本质是
一个可以接受函数作为参数的函数。
2、修饰符为带有魔法方法__call__() 的类的类名的例子:
import time class timeslong(object): def __init__(self,func): self.f = func def __call__(self): start = time.clock() print("It's time starting ! ") self.f() print("It's time ending ! ") end = time.clock() return "It's used : %s ." % (end - start) @timeslong def f(): y = 0 for i in range(10): y = y + i + 1 print(y) return y print(f())
总结:当修饰符为类名时,注意该类必须有__call__的实例方法,被修饰的函数被调用时,会自动被传入__call__,之后__call__被调用。
3、修饰符为Ptyhon内置修饰符的例子:(这个目前感觉没啥用,先copy小甲鱼的啦) 内置的修饰符有三个,分别是 staticmethod、classmethod 和 property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多。
class Hello(object): def __init__: ... @classmethod def print_hello(cls): print "Hello"
classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。