python 装饰器

本文详细介绍了装饰器的概念,展示了如何在不改变原有代码的基础上添加功能,包括基础装饰器的使用、语法糖操作、通用装饰器模板以及高级装饰器的应用实例。同时涵盖了带参数的装饰器和如何使用多个装饰器装饰一个函数。
摘要由CSDN通过智能技术生成

装饰器:可以在不改变原来代码的基础上,给函数添加新的功能

# 装饰器函数
def wrapper(f):
     def inner():
          # 装饰函数之前的部分
          print("I am the former")
          #被装饰函数
          f()
          # 装饰函数之后的部分
          print(('I am the later'))
     return inner

def add():
     print("I am add")

# 将原函数更改为装饰后的函数
add = wrapper(add)
add()

打印的结果:

I am the former
I am add
I am the later

语法糖操作:

# 装饰器函数
def wrapper(f):
     def inner():
          # 装饰函数之前的部分
          print("I am the former")
          f()
          # 装饰函数之后的部分
          print(('I am the later'))
     return inner

#语法糖操作
@wrapper
def add():
     print("I am add")

# 将原函数更改为装饰后的函数
add()

打印结果:

I am the former
I am add
I am the later

通用装饰器的函数模板:

#通用装饰器函数模板
def wrapper(f):
	 #设置 *args 接受数目不确定的非字典参数, *kwargs 接受数目不确定的字典参数
     def inner(*args, **kwargs):
          #目标函数之前的新增函数
          #记录目标函数的返回值,并返回
          ret = f(*args, **kwargs)       
          #目标函数之后的新增函数
          return ret
     return inner

@wrapper
def add(username, password):

高级装饰器:多个装饰器装饰一个函数。

def wrapper1(f):
     def inner(*args, **kwargs):
          print("wrapper1_before")
          ret = f(*args, **kwargs)
          print("wrapper1_after")
          return ret
     return  inner

def wrapper2(f):
     def inner(*args, **kwargs):
          print("wrapper2_before")
          ret = f(*args, **kwargs)
          print("wrapper2_after")
          return ret
     return  inner

def wrapper3(f):
     def inner(*args, **kwargs):
          print("wrapper3_before")
          ret = f(*args, **kwargs)
          print("wrapper3_after")
          return ret
     return  inner

#三个装饰器装饰k函数
#就近原则,wrapper1先装饰k,然后整个函数合并后赋给k,之后wrapper2又装饰k,然后整个函数合并后赋给k,依此类推,得到全部的函数
@wrapper3
@wrapper2
@wrapper1
def k():
     print("I am k")

k()

打印后的结果:

wrapper3_before
wrapper2_before
wrapper1_before
I am k
wrapper1_after
wrapper2_after
wrapper3_after

带参数的装饰器:一个装饰器装饰多个函数。通过对首部参数的调整,来实时地改变自身,来适应被修饰函数

name = input("Please Input: ")
#带参数的装饰器
def wrapper_outer(name):
     def wrapper(f):
          def inner(*args, **kwargs):
               print(name, "wrapper_before")
               ret = f(*args, **kwargs)
               print(name, "wrapper_after")
               return ret
          return inner
     return wrapper

#返回wrapper 调用wrapper
@wrapper_outer(name)
def func():
     print("I am func")

func()

打印结果:

Please Input:ww
ww wrapper_before
I am func
ww wrapper_after
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值