面试题编程题15-python 装饰器简单实例

from time import sleep
import time
#python装饰器库 - functools
from functools import wraps
#装饰普通函数
def decorator(fun):
    @wraps(fun)
    def wrapper():
        start_time=time.time()
        fun()
        end_time=time.time()
        print(end_time-start_time)
    return wrapper
@decorator
def func():
    sleep(1)

#如上所示,有了 @ ,我们就可以省去func = decorator(func)这一句了,直接调用 func() 即可得到想要的结果。你们看到了没有,func() 函数不需要做任何修改,只需在定义的地方加上装饰器
func()

func=decorator(func)# 因为装饰器 decorator(func) 返回的时函数对象 wrapper,这条语句相当于  func = wrapper
func()# 执行foo()就相当于执行 wrapper()

#这里的函数被wrapper替代了。它重写了我们函数的名字和注释文档(docstring)。幸运的是Python提供给我们一个简单的函数来解决这个问题,那就是functools.wraps。我们修改上一个例子来使用functools.wraps
print('Steve '+func.__name__)


#装饰类方法,带参数self
def decorator1(fun):
    def wrapper(number):
        start_time = time.time()
        fun(number)
        end_time = time.time()
        print(end_time - start_time)
    return wrapper
class Example():
    @decorator1
    def func(self):
        sleep(1)
Example().func()

#类装饰器
class Decorator():
    def __init__(self,f):
        self.f=f
    def __call__(self, *args, **kwargs):
        print('start decoration!')
        self.f()
        print('enf decoration!')
@Decorator
def func():
    print('func()')
func()

#装饰器链(多个装饰器)
def decorator1(fun):
    @wraps(fun)
    def wrapper():
        print('decotator1!')
        fun()
    return wrapper
def decorator2(fun):
    @wraps(fun)
    def wrapper():
        print('decotator2!')
        fun()
    return wrapper
@decorator2
@decorator1
def func():
    print('func()!')
func()

想要了解更多,详见如下链接作者所写文章:
https://www.runoob.com/w3cnote/python-func-decorators.html

https://www.cnblogs.com/lianyingteng/p/7743876.html

转载于:https://www.cnblogs.com/feihujiushiwo/p/10983754.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值