装饰器

# 一、不含参数的装饰器
#装饰无参数函数
def log(func):
    def warrper():
        print("before func() called.")
        ret = func()
        print("after func() called.")
        return ret
    return warrper
# 使用糖装饰now函数
@log
def now():
    print('func() called')

---------------------------------------------------------------------------

#装饰确定参数的函数
def deco(func):
    def warrper(a,b):
        print("before func() called.")
        ret = func(a,b)
        print("after func() called.")
        return ret
    return warrper

@deco
def func(a,b):
    print('func() called')
    return a+b

# 调用函数
print(func(3,5))

----------------------------------------------------------------------------------------

# 2、装饰不确定参数的函数
def log_single(func):
    def wrapper(*args,**dict):
        print("before func() called.")
        return func(*args,**dict)
    return wrapper

#在调用函数前后动态增加功能
def log_double(func):
    def wrapper(*args,**dict):
        print("before func() called.")
        func(*args,**dict)
        print("after func() called.")
        return func
    return wrapper

-----------------------------------------------------------------------------------------

# 二、含参数的装饰器

# 装饰器带参数
def deco(arg):
    def _deco(func):
        def __deco():
            print('call before',arg)
            ret = func()
            print('call after',arg)
            return ret
        return __deco
    return _deco

# 糖装饰
@deco('hello')
def func():
    print('func called')

# 调用
func()

# 执行结果
# call before hello
# func called
# call after hello

---------------------------------------------------------------------------------------

# 装饰器带类参数(类的静态方法)
class Locker:
    def __init__(self):
        print("locker.__init__() should be not called")
    @staticmethod
    def acquire():
        print("locker.acquire() called")
    @staticmethod
    def release():
        print("locker.release() called")

def deco(cls):
    "cls必须实现acquire 和release 的静态方法"
    def _deco(func):
        def __deco():
            print("before called")
            cls.acquire()
            ret = func()
            cls.release()
            return ret
        return __deco
    return _deco
# 糖装饰
@deco(Locker)
def func():
    print("func is called")

# 调用
func()

--------------------------------------------------------------------------------------------

# 装饰器带类参数(类的实例方法)
class Locker:
    def __init__(self):
        print("locker.__init__() should be not called")
    def acquire(self):
        print("locker.acquire() called")
    def release(self):
        print("locker.release() called")

def deco(self):
    "cls必须实现acquire 和release 的静态方法"
    def _deco(func):
        def __deco():
            print("before called")
            self.acquire()
            ret = func()
            self.release()
            return ret
        return __deco
    return _deco
# 糖装饰
l=Locker()
@deco(l)
def func():
    print("func is called")

# 调用
func()
# 执行结果
# locker.__init__() should be not called
# before called
# locker.acquire() called
# func is called
# locker.release() called

--------------------------------------------------------------------------------------------------

# 装饰器带类参数(公共类,一个函数应用多个装饰器)
class mylocker:
    def __init__(self):
        print("mylocker.__init__() called")
    @staticmethod
    def acquire():
        print("mylocker.acquire() called")
    @staticmethod
    def unlock():
        print("mylocker.unlock() called")

class lockerex(mylocker):
    @staticmethod
    def acquire():
        print("lockerex.acquire() called")
    @staticmethod
    def unlock():
        print("lockerex.unlock() called")

# 闭包函数
def deco(cls):
    def _deco(func):
        def __deco():
            cls.acquire()
            ret = func()
            cls.unlock()
            return ret
        return __deco
    return _deco

@deco(mylocker)
@deco(lockerex)
def func():
    print('func called')

# 函数调用
func()

# 执行结果
# mylocker.acquire() called
# lockerex.acquire() called
# func called
# lockerex.unlock() called
# mylocker.unlock() called

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值