python log函数_python之Decorators装饰器

今天学习python的Decorators装饰器,并记录学习过程欢迎大家一起交流分享。

5ec0046f4aac89d9febe6a1dd4cad0cc.png

新建一个python文件命名为py3_decorators.py,在这个文件中进行操作代码编写:

#Decorators装饰器#装饰器是一种动态改变函数功能的方法。#例如,如果您想在运行函数时记录日志信息,#您可以使用装饰器添加此功能#而无需修改原始函数的源代码#首先定义一个函数def outer_function(): msg = 'Hello' def inner_function(): print(msg) return inner_function()#调用函数outer_function()#打印结果为:Hello#将上面的函数做下调整传递参数def outer_function(msg): def inner_function(): print(msg) return inner_function#初始化函数hi_func = outer_function('Hi')bye_func = outer_function('Bye')#调用hi_func()bye_func()#接下来写一个作为装饰器的函数#参数为一个原始的函数#执行这个原始函数 并返回def decorator_function(original_function): def wrapper_function(): print('wrapper_function在{}之前执行'.format(original_function.__name__)) return original_function() return wrapper_function#定义一个函数作为原始函数def display(): print('display function ran')#给display函数添加装饰器decorator_display = decorator_function(display)#调用函数decorator_display()#wrapper_function在display之前执行#display function ran#使用装饰器语法的形势执行上边的原始函数@decorator_functiondef display(): print('display function ran')#直接调用display函数display() #wrapper_function在display之前执行#display function ran#熟悉java的童鞋应该知道#装饰器实际类似于java中的annotation注解#继续修改装饰器函数添加参数def decorator_function(original_function): def wrapper_function(*args,**kwargs): print('wrapper_function在{}之前执行'.format(original_function.__name__)) return original_function(*args,**kwargs) return wrapper_function#定义一个带参数函数#并添加装饰器@decorator_functiondef display_info(name,age): print('display_info run with{},{}'.format(name,age))#调用函数display_info('TBag',28)#wrapper_function在display_info之前执行#display_info run withTBag,28#创建一个装饰器类:class decorator_cls(): def __init__(self,original_function): self.original_function = original_function def __call__(self,*args,**kwargs): print('__call__ 在{}之前执行'.format(self.original_function.__name__)) return self.original_function(*args,**kwargs)@decorator_clsdef display(): print('display function ran')display() #__call__ 在display之前执行#display function ran@decorator_clsdef display_info(name,age): print('display_info run with{},{}'.format(name,age))#调用函数display_info('TBag',28)#__call__ 在display_info之前执行#display_info run withTBag,28#下面写两个自定义的装饰器函数#一个用来记录日志#一个用来记录函数执行的时间def my_logger(original_function): #导入日志模块 #后面文章会细讲 #这里只做了解 import logging logging.basicConfig(filename='{}.log'.format(original_function.__name__),level=logging.INFO) def wrapper(*args,**kwargs): logging.info('Ran with args:{} and kwargs:{}'.format(args,kwargs)) return original_function(*args,**kwargs) return wrapperdef my_timer(original_function): import time def wrapper(*args,**kwargs): t1 = time.time() result = original_function(*args,**kwargs) t2 = time.time() - t1 print('{} ran in {} sec'.format(original_function.__name__,t2)) return wrapper#使用日志装饰器@my_loggerdef display_info(name,age): print('display_info run with {},{}'.format(name,age))#调用函数display_info('TBag',28)display_info('Mc',18)#运行后会生成一个日志文件#display_info.log#并记录日志信息#使用时间装饰器import time@my_timerdef display_info(name,age): #为了测试效果这里休眠1秒 time.sleep(1) print('display_info run with {},{}'.format(name,age))#调用函数display_info('yale',18)#display_info run with yale,18#display_info ran in 1.0000569820404053 sec#我们给display_info#同时添加记录日志和时间测试装饰器@my_logger@my_timerdef display_info(name,age): #为了测试效果这里休眠1秒 time.sleep(1) print('display_info run with {},{}'.format(name,age))#调用函数display_info('yale',18)###接下来看带参数的装饰器函数def prefix_decorator(prefix): def decorator_function(original_function): def wrapper_function(*args, **kwargs): print(prefix, '执行之前', original_function.__name__) result = original_function(*args, **kwargs) print(prefix, '执行之后', original_function.__name__, '') return result return wrapper_function return decorator_function@prefix_decorator('LOG:')def display_info(name, age): print('display_info ran with arguments ({}, {})'.format(name, age))display_info('John', 25)display_info('Travis', 30)#LOG: 执行之前 display_info#display_info ran with arguments (John, 25)#LOG: 执行之后 display_info #LOG: 执行之前 display_info#display_info ran with arguments (Travis, 30)#LOG: 执行之后 display_info 

今天初学python的Decorators装饰器学习就到这里!

关注公号yale记

下面的是我的公众号二维码图片,欢迎关注。

214b8ac50252bf55853f69fec034ba44.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值