您的位置:首页 > 编程语言 > Python开发

Python装饰器

2015-08-05 18:04 555 查看
# -*- coding:gbk -*-
'''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)”
但发现新函数只在第一次被调用,且原函数多调用了一次'''

def deco(func):
print("before myfunc() called.")
func()
print("  after myfunc() called.")
return func

@deco
def myfunc():
print(" myfunc() called.")

myfunc()
myfunc()

使用内嵌包装函数来确保每次新函数都被调用

# -*- coding:gbk -*-
'''示例4: 使用内嵌包装函数来确保每次新函数都被调用,
内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''

def deco(func):
def _deco():
print("before myfunc() called.")
func()
print("  after myfunc() called.")
# 不需要返回func,实际上应返回原函数的返回值
return _deco

@deco
def myfunc():
print(" myfunc() called.")
return 'ok'

myfunc()
myfunc()
对带参数的函数进行装饰

'''示例5: 对带参数的函数进行装饰,
内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''

def deco(func):
def _deco(a, b):
print("before myfunc() called.")
ret = func(a, b)
print("  after myfunc() called. result: %s" % ret)
return ret
return _deco

@deco
def myfunc(a, b):
print(" myfunc(%s,%s) called." % (a, b))
return a + b

myfunc(1, 2)
myfunc(3, 4)


让装饰器带参数

'''示例7: 在示例4的基础上,让装饰器带参数,
和上一示例相比在外层多了一层包装。
装饰函数名实际上应更有意义些'''

def deco(arg):
def _deco(func):
def __deco():
print("before %s called [%s]." % (func.__name__, arg))
func()
print("  after %s called [%s]." % (func.__name__, arg))
return __deco
return _deco

@deco("mymodule")
def myfunc():
print(" myfunc() called.")

@deco("module2")
def myfunc2():
print(" myfunc2() called.")

myfunc()
myfunc2()


让装饰器带 类 参数

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 %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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: