Python @ 语法糖,装饰器(详解)

自定义的装饰器是@+自定义的闭包,可以动态的将装饰器化的函数功能添加在其他函数上。

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来赋值)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值