装饰器

装饰器

  • 使用方法
    先定义一个装饰函数(帽子)(也可以用类、偏函数实现)
    再定义你的业务函数、或者类(人)
    最后把这顶帽子带在这个人头上
  • 调用顺序
    在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数或装饰器。

无参函数装饰器

#  这是装饰函数  
def logger(func):
	def wrapper(*args, **kw):
		print('我准备开始计算:{} 函数了:'.format(func.__name__))
	# 真正执行的是这行
	func(*args, **kw)
	print('啊哈,我计算完啦。给自己加个鸡腿!!')
return wrapper

假如,我的业务函数是,计算两个数之和。写好后,直接给它带上帽子。

@logger
def add(x, y):
  print('{} + {} = {}'.format(x, y, x+y))
# 输入
>>  add(200, 50)
# 输出
>>  我准备开始计算:add 函数了:
	200 + 50 = 250
	啊哈,我计算完啦。给自己加个鸡腿!

带参函数装饰器

def say_hello(contry):
  def wrapper(func):
    def deco(*args, **kwargs):
      if contry == "china":
        print("你好!")
      elif contry == "america":
        print('hello.')
      else:
        return
      # 真正执行函数的地方
      func(*args, **kwargs)
    return deco
  return wrapper

@say_hello("china")
def chinese():
  print("我来自中国。")
 
@say_hello("america")
def american():
  print("I am from America.")
# 输入
>	american()
	print("---------------")
	chinese()
# 输出
>	hello.
	I am from America
	---------------------
	你好!
	我来自中国

无参的装饰器类

以上是基于函数实现的装饰器,还有基于类实现的装饰器。
基于类装饰器的实现,必须实现 __call____init__两个内置函数。
__init__ :接收被装饰函数
__call__ :实现装饰逻辑。

class logger(object):
  def __init__(self, func):
    self.func = func

  def __call__(self, *args, **kwargs):
    print("[INFO]: the function {func}() is running..."\
      .format(func=self.func.__name__))
    return self.func(*args, **kwargs)

@logger
def say(something):
  print("say {}!".format(something))

say("hello")
# 输出
>	[INFO]: the function say() is running...
	say hello!

带参的装饰器类

带参数和不带参数的类装饰器有很大的不同。
__init__ :不再接收被装饰函数,而是接收传入参数。
__call__ :接收被装饰函数,实现装饰逻辑。

class logger(object):
  def __init__(self, level='INFO'):
    self.level = level

  def __call__(self, func): # 接受函数
    def wrapper(*args, **kwargs):
      print("[{level}]: the function {func}() is running..."\
        .format(level=self.level, func=func.__name__))
      func(*args, **kwargs)
    return wrapper #返回函数

@logger(level='WARNING')
def say(something):
  print("say {}!".format(something))

say("hello")
# 输出
>	[WARNING]: the function say() is running...
	say hello!

wraps装饰器

使用 functools .wraps 装饰器,它的作用就是将 被修饰的函数(wrapped) 的一些属性值赋值给 修饰器函数(wrapper) ,最终让属性的显示更符合我们的直觉。

from functools import wraps
def decorator_name(f):
	@wraps(f)
	def decorated(*args, **kwargs):
		if not can_run:
			return "Function will not run"
		return f(*args, **kwargs)
	return decorated
	
@decorator_name
def func():
	return("Function is running")
	
can_run = True
print(func())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值