python装饰器

装饰器example
Python Decorators in 15 Minutes

  • 什么是装饰器?
    • python装饰器用于装饰函数。可以在保留原函数功能的条件下,赋予该函数更丰富的功能(而无需改动原函数)
  • 为什么要用装饰器?
    • 可以更便于开发,实现代码复用
  • 装饰器可以解决哪些问题?
    • 不破坏原函数的条件下,扩展函数功能(或函数权限)

小明每学会一个新本领,他妈妈都会说:“小明太棒了”。所以把妈妈说的话单独写个函数,以后在每次调用时,就可以代码复用

  • momSaid(func)里的参数为函数
  • def wrapper(*args,**kwargs)return wrapper 可以自动调用函数参数。(如 learnAdd函数有3个参数,learnSubtraction 有两个,但是完全没问题)
def momSaid(func):
    def wrapper(*args,**kwargs):
        f=func(*args,**kwargs)
        print("算数结果为{}".format(f))
        print("妈妈说小明太棒了")
        return f
    return wrapper

@momSaid
def learnAdd(a,b,c):
    print("小明学会了加法")
    res=a+b+c
    return res

@momSaid
def learnSubtraction(a,b):
    print("小明学会了减法")
    res=a-b
    return res

learnAdd(3,2,1)
print("===")
learnSubtraction(2,1)

运行结果为:

小明学会了加法
算数结果为6
妈妈说小明太棒了
===
小明学会了减法
算数结果为1
妈妈说小明太棒了

小明和他爸爸都喜欢看动画片。于是小明的妈妈在电视上加了年龄权限,当爸爸在看天线宝宝时,会提醒他别看啦(增加函数权限)。而小明在看时,就不会提醒(不破坏原函数)

def accessTV(func):
    def wapper(*args,**kwargs):
        if age<=18:
            return func(*args,**kwargs)
        print("小明的爸爸,你都成年啦,别看天线宝宝啦")
    return wapper

@accessTV
def watchTV():
    print("小明在看天线宝宝")

age=10
watchTV()

运行结果为:

age小于等于18时,函数输出:小明在看天线宝宝
age大于18时,函数输出:小明的爸爸,你都成年啦,别看天线宝宝啦

参考1,参考2

chain decorator

有多个装饰器时,先包裹里面的

def set_fun1(func):
    print("set_fun1")  # 打印用于验证在多个装饰器的情况下,多个装饰器之间的执行顺序

    def call_fun1(*args, **kwargs):
        print("call_fun1")  # 当被装饰函数执行时,会打印
        func()

    return call_fun1


def set_fun2(func):
    print("set_fun2")

    def call_fun2(*args, **kwargs):
        print("call_fun2")
        func()

    return call_fun2


# 装饰函数
@set_fun1
@set_fun2
def test():
    print("hello world")


test()

# set_fun2   # set时相反
# set_fun1   # set时相反
# call_fun1  # 再被1包裹
# call_fun2  # 先被2包裹
# hello world

   转载规则


《python装饰器》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第三章:信封嵌套问题 第三章:信封嵌套问题
labuladong 信封嵌套问题 354. 俄罗斯套娃信封问题 先对宽度(第一个数)进行升序排序,宽度相同时,对高度(第二个数)降序排序 envelopes=sorted(envelopes,key=lambda x:(x[0],-x[
2020-08-16
下一篇 
第三章:前缀和技巧 第三章:前缀和技巧
labuladong 前缀和技巧 560. 和为K的子数组方法1:前缀和 (暴力超时)保存一个数组的前缀和,然后利用差分法得出任意区间段的和 class Solution: def subarraySum(self, nums: L
2020-08-12
  目录