实现acquire和release静态方法'''
? ? def _deco(func):
? ? ? ? def __deco():
? ? ? ? ? ? print("before %s called [%s]." % (func.__name__, cls))
? ? ? ? ? ? cls.acquire()
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? return func()
? ? ? ? ? ? finally:
? ? ? ? ? ? ? ? cls.release()
? ? ? ? return __deco
? ? return _deco
?
@deco(locker)
def myfunc():
? ? print(" myfunc() called.")
?
myfunc()
myfunc()
输出为:
before myfunc called [__main__.locker].
locker.acquire() called.(this is staticmethon)
myfunc() called.
? locker.release() called.(do't need object )
before myfunc called [__main__.locker].
locker.acquire() called.(this is staticmethon)
myfunc() called.
? locker.release() called.(do't need object )
装饰器总结
当我们对某个方法应用了装饰方法后, 其实就改变了被装饰函数名称所引用的函数代码块入口点,使其重新指向了由装饰方法所返回的函数入口点。由此我们可以用decorator改变某个原有函数的功能,添加各种操作,或者完全改变原有实现。