python进阶装饰器(语法糖)

# coding =utf-8
import datetime
import time

# """method.decorator方法装饰器""""
def timer(fn):
    def wrapper(*args, **kwargs):
            start = datetime.datetime.now()
            fn_foo = fn(*args, **kwargs)
            delta = (datetime.datetime.now() - start).total_seconds()
            if delta > 2:
                print ("{}:{}s".format(fn.__name__, delta))
            return fn_foo
    return wrapper


@timer
def add(x, y):
    time.sleep(3)
    return x + y
#foo = timer(add)  装饰器@timer这个函数干了什么第一步传入一个方法add,返回一个wrapper这里我写的用foo比较抽象其实就是一个wrapper
#foo(4, 6)  # 第二步@timer干了什么解构参数啊,给wapper对应位置args,kwargs传参,两步理解简化思维
print(add(4, 6))

# wrapper =timer(fn)
# wrapper(*args, **kwargs)


# """class.method decorator类方法装饰器"""


def decorator(fn):
    def wrapper(self,var):
        fn_foo = fn(self,var)
        return fn_foo
    return wrapper


class Foo(object):
    def __init__(self, name):
        self.age = 36
        self.name = name

    @decorator
    def fn(self, string):
        print "i am class.fn that be decorated:" + string

Foo('zs').fn('variable')


# part3: the decorator with args带参数的装饰器
def decorates(*dec_args, **dec_kwgrgs):
    def decorator(fn):
        def wrapper(*args, **kwargs):
            fn_foo = fn(*args, **kwargs)
            return fn_foo
        return wrapper
    return decorator

var1_dec = 'var_dec1'
var2_dec = 'var_dec2'


@decorates(var1_dec, var2_dec)
def fxx(fxx_var1, fxx_var2):
    print "decorator.var1:{},decorator.var2:{}####fxx.var1:{},fxx.var2:{}" .format(var1_dec,var2_dec,fxx_var1,fxx_var2)
fxx('tom', 'jack')



# many decorators多装饰器,可以理解为一层由内向外的盒子包裹礼物一样,先最内再最外过程

def deco01(func):
    def wrapper(*args, **kwargs):
        print("this is deco01 start")
        func(*args, **kwargs)
        print("deco01 end here")
    return wrapper


def deco02(func):
    def wrapper(*args, **kwargs):
        print("this is deco02 start")
        func(*args, **kwargs)

        print("deco02 end here")
    return wrapper


@deco02
@deco01
def func(x, y):
    print "result is {}".format(x+y)

func(3, 4)






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值