今天学习python的Decorators装饰器,并记录学习过程欢迎大家一起交流分享。
新建一个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记
下面的是我的公众号二维码图片,欢迎关注。