谈谈对Python装饰器的理解

装饰器,又名函数修饰符。笔者觉得函数修饰符,这个名字更能直观的反应他的作用。


函数修饰符语法特征 :
         @ + 修饰符

函数修饰符的装饰对象:
        函数修饰符,就是说他修饰的是函数,而不是其他的东西,不是类,也不是变量,就函数而已!

修饰符本身可以是哪些东西:
   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() 调用,而无需绑定实例对象了。

posted @ 2016-06-13 15:12  宋桓公  阅读(924)  评论(0编辑  收藏  举报