python装饰器——函数装饰器和类装饰器!

一、函数装饰器

"""
python装饰器@改变函数引用
"""

def b(func):
    x= 1
    def c(a1,a2=0):
        print("******in ","c")
        print("******in ","c"," a1=",a1)
        func(a1,a2)
    print(" b complete!")
    return c

@b # 这句话等价于a = b(a),即把a由指向原来的函数改为指向了调用b()函数的返回值(划重点)

def a(a1,a2=0):
    print("----------run ", "a")
    print("----------a1: ", a1)
    print("----------a2: ", a2)

#a()  #报错
#a = b(a)  #报错
a(100,400)
#a()  #报错

执行结果:

b complete!
******in  c
******in  c  a1= 100
----------run  a
----------a1:  100
----------a2:  400

二、类装饰器

"""记录函数调用次数”“”
#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""装饰请配合__call__函数统计某函数调用次数"""


class Sat():
    def __init__(self, func):
        self.func = func
        self.count = 0

    def __call__(self, *args, **kwargs):
        self.count +=1
        return self.func(*args, **kwargs)

@Sat
def test(nu):
    print("test method is running--%s" % nu)


if __name__ == "__main__":
    test(1)
    test("aaa")
    print("----->count=",test.count)
    test(9)
    print("----->count=",test.count)

三、带参数的通用装饰器

In [244]: def aa(k,y):
     ...:     l = list((k,y))
     ...:     print(l)
     ...:     def set_func(func):
     ...:         print("in set_func")
     ...:         def call_func(*args,**kwargs):
     ...:             print("in call_func")
     ...:             return func(*args,**kwargs)
     ...:         return call_func
     ...:     return set_func
     ...: 

In [245]: @aa(11,99) # 先调用aa函数拿到返回值后再装
     ...: def dd(x):
     ...:     print("in dd x=",x)
     ...:     

输出:

[11, 99]
in set_func

调用dd函数

In [246]: dd(5)
in call_func
in dd x= 5
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值