Python装饰器

Python 装饰器

闭包函数

定义:函数的返回值也可以是函数对象

def func1():
    def get_func(msg):
        print('传入参数: {}'.format(msg))
    return get_func

f1 = func1()
f1('hello world')

# 输出
传入参数:hello world

简单的装饰器

def my_decorator(funct):
    def wrapper():
        print('装饰器')
        funct()
    return wrapper
@my_decorator
def func1():
    print('Hello world')
func1()

#输出
装饰器
Hello world

带参数据装饰器

def my_decorator(func):
    def wrapper(msg):
        print('装饰器')
        func(msg)
    return wrapper


@my_decorator
def greet(msg):
    print(msg)


greet('hello world')

# 输出
装饰器
hello world

可以接收任何参数


def my_decorator(func):
    def wrapper(*args, **kwargs):
        print('wrapper of decorator')
        func(*args, **kwargs)
    return wrapper

@my_decorator
def greet(msg):
    print(msg)


greet('hello world')

# 输出
装饰器
hello world

带自定义参数的装饰器

def repeat(num):
    def my_decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                print('wrapper of decorator')
                func(*args, **kwargs)
        return wrapper
    return my_decorator


@repeat(4)
def greet(message):
    print(message)

greet('hello world')

# 输出:
wrapper of decorator
hello world
wrapper of decorator
hello world
wrapper of decorator
hello world
wrapper of decorator
hello world

类装饰器

class Count:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print('num of calls is: {}'.format(self.num_calls))
        return self.func(*args, **kwargs)

@Count
def example():
    print("hello world")

example()

# 输出
num of calls is: 1
hello world

example()

# 输出
num of calls is: 2
hello world

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值