博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 装饰器
阅读量:4678 次
发布时间:2019-06-09

本文共 2103 字,大约阅读时间需要 7 分钟。

装饰器:在不修改函数源代码的基础上,添加函数功能

例如:

1 def log_time(func):  # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用 2     def make_decorater(): 3         print('现在开始装饰') 4         func() 5         print('现在结束装饰') 6     return make_decorater  # log_time()被调用后,运行此函数返回make_decorater()函数的引用make_decorater 7   8 @log_time  # 此行代码等同于,test=log_time(test)=make_decorater 9 def test():10     print('我是被装饰的函数')11 test()  # test()=make_decorater()

当被装饰的函数有形参时:

def log_time(func):    def make_decorater(*args,**kwargs):  # 接受调用语句的实参,在下面传递给被装饰函数(原函数)        print('现在开始装饰')        test_func = func(*args,**kwargs)  # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回        print('现在结束装饰')        return test_func  # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。    return make_decorater  @log_timedef test(num):    print('我是被装饰的函数')    return num+1 a = test(2)  # test(2)=make_decorater(2)print(a)

当@装饰器后有参数时:

def get_parameter(*args,**kwargs):  # 工厂函数,用来接受@get_parameter('index.html/')的'index.html/'    def log_time(func):        def make_decorater():            print(args,kwargs)            print('现在开始装饰')            func()            print('现在结束装饰')        return make_decorater    return log_time @get_parameter('index.html/')def test():    print('我是被装饰的函数')    # return num+1 test()  # test()=make_decorater()

两个装饰器同时修饰一个函数(重点看执行顺序):

def log_time1(func):    def make_decorater(*args,**kwargs):         print('1现在开始装饰')        test_func = func(*args,**kwargs)         print('1现在结束装饰')         return test_func     return make_decorater def log_time2(func):    def make_decorater(*args,**kwargs):  # 接受调用语句的实参,在下面传递给被装饰函数(原函数)        print('2现在开始装饰')        test_func = func(*args,**kwargs)  # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回        print('2现在结束装饰')        return test_func  # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。    return make_decorater @log_time1@log_time2def test(num):    print('我是被装饰的函数')    return num+1 a = test(2)  # test(2)=make_decorater(2)print(a)

 

转载于:https://www.cnblogs.com/chenpengzi/p/11344014.html

你可能感兴趣的文章
dubbo 限流之TpsLimitFilter
查看>>
java基础 -- 关键字static的用法
查看>>
Cmdlet开发与学习(三)
查看>>
python之面向对象进阶
查看>>
Java学习----集合函数
查看>>
Sublime Text配置Python开发利器
查看>>
updateFilter
查看>>
脏治检查实现原理
查看>>
7.连接查询 -- SQL92标准
查看>>
jquery.range.js 滑块
查看>>
python 网络编程
查看>>
poj 2015 IP Address
查看>>
poj 2785 4 Values whose Sum is 0
查看>>
手把手教你如何加入到github的开源世界!
查看>>
JavaScript案例二:在末尾添加节点
查看>>
表现设身处地的方法:杜彬(Ben Duffy)方法
查看>>
第二个spring冲刺第4天
查看>>
Python3 sqlacodegen 根据已有数据库生成 ORM 使用的 model.py
查看>>
用位运算生成下一个含有k个1的二进制数
查看>>
setContentView()与LayoutInflater.inflate()作用
查看>>