python 装饰器

python 装饰器的详细描述见 https://zhaochj.github.io/2016/05/05/2016-05-05-%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E8%A3%85%E9%A5%B0%E5%99%A8/

一:函数装饰函数

def wrapFun(func):
    def inner(a, b):
        print('function name:', func.__name__)
        r = func(a, b)
        return r
    return inner

@wrapFun
def myadd(a, b):
    return a + b

print(myadd(2, 3))

 带参数的装饰器

def wrapFun_with_args(my_args):
    def wrapFun(func):
        def inner(a, b):
            print("my_args: ",my_args)
            print('function name:', func.__name__)
            r = func(a, b)
            return r
        return inner
    return wrapFun

@wrapFun_with_args(my_args="my_args")
def myadd(a, b):
    return a + b

print(myadd(2, 3))

二:函数装饰类

def wrapClass(cls):
    def inner(a):
        print('class name:', cls.__name__)
        return cls(a)
    return inner

@wrapClass
class Foo():
    def __init__(self, a):
        self.a = a

    def fun(self):
        print('self.a =', self.a)


m = Foo('xiemanR')
m.fun()

带参数装饰器

def wrapclass_with_args(my_args):
    def wrapClass(cls):
        def inner(a):
            print("my_args: ", my_args)
            print('class name:', cls.__name__)
            return cls(a)
        return inner
    return wrapClass

@wrapclass_with_args(my_args="my_args")
class Foo():
    def __init__(self, a):
        self.a = a

    def fun(self):
        print('self.a =', self.a)


m = Foo('xiemanR')
m.fun()

 

三:类装饰函数

class ShowFunName():
    def __init__(self, func):
        self._func = func

    def __call__(self, a):
        print('function name:', self._func.__name__)
        return self._func(a)


@ShowFunName
def Bar(a):
    return a

print(Bar('xiemanR'))

带参数装饰器

 

四:类装饰类

class ShowClassName(object):
    def __init__(self, cls):
        self._cls = cls

    def __call__(self, a):
        print('class name:', self._cls.__name__)
        return self._cls(a)


@ShowClassName
class Foobar(object):
    def __init__(self, a):
        self.value = a

    def fun(self):
        print(self.value)

a = Foobar('xiemanR')
a.fun()

五:函数装饰类方法

#coding=utf-8

import time

def cal_time(func_name):
    def inner(self, *args, **kwargs):
        time1 = time.time()
        func_name(self, *args,**kwargs)
        time2 = time.time()
        print("耗时 %s" % (time2 - time1))
    return inner


class A:

    @cal_time
    def simulate_sleep(self):
        print("a")
        time.sleep(3)
        print("b")


if __name__ == '__main__':
    A().simulate_sleep()

带参数的装饰器

#coding=utf-8

import time

def cal_time_with_args(my_args):
    def cal_time(func_name):
        def inner(self, *args, **kwargs):
            print("my_args", my_args)
            time1 = time.time()
            func_name(self, *args,**kwargs)
            time2 = time.time()
            print("耗时 %s" % (time2 - time1))
        return inner
    return cal_time

class A:

    @cal_time_with_args(my_args="my_args")
    def simulate_sleep(self):
        print("a")
        time.sleep(3)
        print("b")


if __name__ == '__main__':
    A().simulate_sleep()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值