装饰器是对功能函数的加强. 在原来的功能函数之外,另外定义一个装饰器函数,对原来的功能函数进行封装(wrapper)并在wrapper的过程中增加一些辅助功能。
创新互联专注于清苑网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供清苑营销型网站建设,清苑网站制作、清苑网页设计、清苑网站官网定制、微信小程序开发服务,打造清苑网络公司原创品牌,更为您提供清苑网站排名全网营销落地服务。
如下场景:
业务函数func_biz_1(), func_biz_2()... 里面写的是业务逻辑代码。如果我们现在希望在每个函数里面增加一些辅助功能(比如打印日志,计算函数运行时间)
这些辅助功能的代码都是通用的。不使用decorator的情况下我们就要在业务函数里面增加这些辅助代码,缺点:
要解决这个问题就要用装饰器,将业务函数封装(wrapper),在wrapper的过程中将辅助功能代码加进去。
一个函数里面既有主业务逻辑(打印质数),又有辅助功能(对函数执行时间计时)
import time
# 判断输入的num是否是质数
def is_prime(num):
''' Tell if num is a prime number '''
if num < 2:
return False
if num == 2:
return True
for i in range(2, num):
if num % i == 0:
return False
return True
# 打印2到之间所有的质数
def prime_numbers():
''' print all the prime numbers btw 2...
print the onsumed time
'''
t_start = time.time()
for i in range(2, ):
if is_prime(i):
print(i)
t_stop = time.time()
print("time consumed: {}".format(t_stop - t_start))
prime_numbers()
缺点: 统计时间的代码和业务代码混在一起写在prime_numbers()里面
import time
# 定义一个装饰器: 统计函数运行时间
def display_time(func):
''' define a decorator函数,参数是函数 '''
def wrapper():
t_start = time.time()
func()
t_stop = time.time()
print("time consumed: {:.4}".format(t_stop - t_start))
return wrapper
# 判断输入的num是否是质数
def is_prime(num):
''' Tell if num is a prime number '''
if num < 2:
return False
if num == 2:
return True
for i in range(2, num):
if num % i == 0:
return False
return True
# 打印2到之间的质数count
@display_time
def prime_numbers():
''' count the prime numbers btw 2... '''
for i in range(2, ):
if is_prime(i):
print(i)
prime_numbers() # 运行它的时候实际上运行的是装饰器函数wrapper()
通过装饰器实现了业务逻辑与主服务功能的分离