Python的装饰器的作用

装饰器模式是一个强大的模式,可以给一个函数增加额外的方法而不用修改原来的代码。比如,当我们需要给原来的代码添加日志记录时,需要将原来的代码进行修改,在函数里面增加日志记录的代码。但如果使用装饰器模式,使用装饰器装饰原来的代码,将日志记录放在装饰器里,就可以避免修改原有的代码,同时又实现了所需的功能。这种编程模式就叫做面向切片编程。
作用和使用场景:

  • 引入日志
  • 函数执行时间统计
  • 执行函数前预备处理
  • 执行函数前的清理功能
  • 权限效验等

1、日志记录实例:

def	func():
		print("func")
	

现在让我们记录一下这个函数执行时的日志记录,即记录一下函数执行的时间,输出执行时间和方法名。日志输出函数如下

from	datetime	import	datetime  as dt
def log(func):
	print('+str(dt.now()+)'+funnc.__name__)
	func()
但我们想使用func函数的时候,log(func)
会输出:[2017-09-10 20:51:09.970854]func

这就实现了调用 func 时,同时进行日志记录。但这样做很明显会有问题,就是我们需要把所有调用 func 的地方改为 log(func) ,这很麻烦,并且会需要改很多代码。所以,我们换一种写法:

def log(log):
	def wrapper():
		print('['+str(dt.noe())']'+func.__name__)
		func()
		return wrapper
 #请注意,这就是一个装饰器了!

里面那个 wrapper 的意思就是装饰、包裹的意思。我们将 func 函数装饰一下变成了一个新的函数然后返回它。那该如何使用呢?如下:

func = log(func)
func()
#使用方法就是用log装饰器将func装饰一下后返回覆盖掉原有的func即可。

所谓的语法糖的意思就是添加一个语法,让代码更简单的意思。Python为装饰器也提供了一个语法糖,就是 @ 符号。我们可以使用这个符号声明这是一个装饰器。如下,我们使用语法糖的写法给 func 添加 log 这个装饰器:

@log
def func():
	return print('func')
这样写好后,直接调用 func() 即可同时输出日志了:
[2017-09-10 21:10:50.933021]funcfunc

2、装饰器给函数传参

def func(msg):
	print("-->>"+msg)
def log(func):
	def  wrapper(msg):
		print('['+str(dt.now())+']'+func.__name__) 
		return func(msg) 
		return wrapper
这样一改, log 就又可以用了,给 func 再加上语法糖:
@log
def func(msg):
	print("-->>"+msg)
	func('hello')

下面我们就写一个更强力的 log 装饰器,来让装饰器可以装饰任何函数,而不用管那个函数又多少个参数。使用Python的可变参数 *args 和关键字参数 **kwargs 即可。修改 log,如下:

def log(func):
	def wrapper(*args,**kwargs):
		print('['+str(dt.now())+']'+func.__name__) 					     					
		return func(*args, **kwargs)
		return wrapper

装饰器本身也可以带参数,比如说,我们给 log装饰器添加一个参数 is_show 用于是否显示日志输出。如下:

def log(is_show=True):
	def wrapper(func):
		def inner_wrapper(*args, **kwargs):
			if is_show:
			    print('['+str(dt.now())+']'+func.__name__) 		    	 
			    return func(*args, **kwargs)
	 return inner_wrapper 
 return wrapper
# 默认显示日志@log(True)def func1():print("func1")# 默认不显示日志@log(False)def func2(): print("func2")

大数据的文件读取:

  1. 利用生成器generator
  2. 迭代器进行迭代遍历:
  3. for line in file:
  4. grep命令是一种强大的文本搜索工具

如何提高Python的运行效率:

  1. 使用生成器
  2. 关键代码使用外部功能包
  3. 针对循环的优化,尽量避免在循环中访问变量的属性。
  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值