python高级语法——装饰器语法糖

为君一笑 提交于 2020-01-08 20:53:15

高阶函数

在python语言中,参数含有函数名的函数称之为高阶函数。(此时调用的函数不加参数,也就是说没有括号紧跟)

装饰器是什么

在不改变源代码的基础上扩展函数需要的新需求,这就是装饰器。(不改变函数源代码,这也是装饰器最基本的原则)

装饰器,它本身也就是一个函数,应用高阶函数实现。

使用时一般把被装饰的函数的内存地址当参数传入装饰器函数体,通过参数调用被装饰的函数,获得或者修改其属性。

装饰器的使用

一般认为,装饰器使用遵循一定格式,即:高阶函数+高阶函数内嵌套函数。

简单地理解Python中的if __name__ == '__main__'

通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')

if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行

假设有一个需求,我要知道正在运行什么函数,在运行时输出。

有一个比较粗暴的方法。

def func1():
    print(func1.__name__)
    pass
 
 
def func2():
    print(func2.__name__)
    pass
 
 
def func3():
    print(func3.__name__)
    pass
 
 
if __name__ == '__main__':
    func1()
    func2()
    func3()


这一定是对的,但是不自然就想到两个字“封装”,虽然这和装饰器大相径庭,但是两个概念确实有相通之处。

按照装饰器原则,可以这样写。

def funcname(func):
    def out():
        func()
        print(func.__name__)
    return out
 
 
@funcname
def func1():
    pass
 
 
@funcname
def func2():
    pass
 
 
@funcname
def func3():
    pass
 
 
if __name__ == '__main__':
    func1()
    func2()
    func3()


结果是,我们确实实现了这个功能。

装饰器的进一步使用

在之前的这个小实验中,基本上了解了装饰器的用途和写法,然而不是所有的函数都想func1这样简单,无参数。

对于含不定参数的函数,参数由收集参数获取。

def funcname(func):
    def out(*args, **kwargs):
        func(*args, **kwargs)
        print(func.__name__)
    return out
 
 
@funcname
def func1(a, b):
    print(a+b)
 
 
@funcname
def func2(a, b, c):
    print(a+b+c)
 
 
@funcname
def func3(a, b, c, d):
    print(a+b+c+d)
 
 
if __name__ == '__main__':
    func1(1, 2)
    func2(1, 2, 3)
    func3(1, 2, 3, 4)


装饰器的多重使用
不同的装饰器是可以给同一个函数装饰的,会从最后一个装饰器开始执行到第一个装饰器,再执行函数本身。
————————————————
版权声明:本文为CSDN博主「周先森爱吃素」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouchen1998/article/details/82933893

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!