python 的灵活性之装饰器

函数装饰器:函数的相互嵌套,原来是两层,后来功能的增多增加到了三层

def th(arg):
    print(arg)
    def set_args(fun):
        def set_fun(*args, **kwargs):
            print("验证信息!")
            return fun(*args, **kwargs)

        return set_fun
    return  set_args #必须返回闭包的引用!

@th("niji") #在此处相当于  test = set_args(test)   #传参问题
def test():
    print("你好!")
test()

'''
    第一步先执行th("xxx")这个函数,得到闭包的引用,第二步@闭包的引用(@th) th 函数在函数执行前就已经执行了!
'''

第二种:类来实现的装饰器

class roll():
    def __init__(self, function):
        self.function = function

    def __call__(self, *args, **kwargs):
        print("添加额外的功能!")
        self.function()


@roll       #相当于 main = roll(main),也就是说函数调用前执行了创建对象的步骤
def main():
    print("这是小明")
main()      #在这里实际调用的是对象! 对象() 实际是调用 __call__ 方法!

其实python 的装饰器实际上是python 的语法糖的作用,正是由于语法糖才使得python 有着很多的多样性!

 

posted @ 2018-04-25 22:37  十七楼的羊  阅读(118)  评论(0编辑  收藏  举报