自定义的装饰器是@+自定义的闭包,可以动态的将装饰器化的函数功能添加在其他函数上。
form functools import wraps
@wraps(func)
解决安装装饰器后注释信息不能显示的问题。安装在装饰器闭包函数的外层函数中与装饰器外层函数导入同一个参数
from functools import wraps
def timer(fun):
@wraps(fun)
def inner(s): #**args,**kwargs
start=time.time()
ret=fun(s) #**args,**kwargs
end=time.time()
print(end-start)
return ret
return inner
@timer #func=timer(func)
def func(s): #**args,**kwargs
'''lalala'''
for i in range(10000000):
pass
return s
ret=func('s') #**args,**kwargs
print(ret)
print(func.__doc__)
多个装饰器
执行顺序是从下往上(或是从最靠近函数的装饰器开始从内到外),执行上层装饰器时会把下层装饰器返回的函数当成参数传递进去。先走装饰器,再走函数。
#添加多个装饰器
def x1(func):
def inner1():
print('x1...start')
func()
print('x1....end')
return inner1
def x2(func):
def inner2():
print('x2...start')
func()
print('x2....end')
return inner2
@x1
@x2
def fun():
print('fun...')
fun()
''' inner2=x2(fun)
inner1=x1(inner2)
fun()--inner1()'''
>>>
x1...start
x2...start
fun...
x2....end
x1....end
<<<
@property
内置装饰器函数,注意只能面向对象中使用,且使用的方法不能有参数。把一个方法调用方式改成属性调用方式。在方法上添加该装饰器,就可以直接print实例.方法来得到值。
class C:
pass
@property
def zhouchang(self):
pass
c=C()
print(c.zhouchang)
应用于封装内容:
这个装饰器还可以用于return值为封装内容的方法,来直接获得封装内容。
@property的私有方法:@方法.setter、@方法.deleter
@方法.setter:直接赋值私有变量。(还是要写函数,区别是不用调用函数就直接可以类.方法=xx来赋值)