Python装饰器

装饰器(Decorator)

简而言之, 装饰器是修改函数功能的函数, 可以让代码更简洁, 更有 Python 的禅意.

从最基本的函数开始

def print_my_name():
    print("Hello")

很显然, 该函数调用运行后仅仅会打印 Hello, I am 再加上你的名字.

此时, 我们创建一个装饰器:

def my_decorate(func):

	def wrapper():
        print("*****I am decorate1*****")
        func()
        print("*****I am decorate2*****")
        
    return wrapper

再用这个装饰器装饰函数并调用:

@my_decorate
def print_my_name():
    print("Hello")
    
print_my_name()

打印结果:

*****I am decorate1*****
Hello
*****I am decorate2*****

若函数有不确定的参数该怎么办呢?
此时可以使用*args 和**kwargs, *args 没有key值(字符串, 列表等), **kwargs有key值(映射, 字典等).

代码就可以写成下面这样:

def my_decorate(func):
    
    def wrapper(*args, **kwargs):
        print("*****I am decorate1*****")
        func(*args, **kwargs)
        print("*****I am decorate2*****")
        
    return wrapper


@my_decorate
def print_my_name(name):
    print("Hello, I am " + name)
    
print_my_name('your_name')

打印结果:

*****I am decorate1*****
Hello, I am your_name
*****I am decorate2*****

再进一步, 如果想要给装饰器默认参数呢?
可以再嵌套一层:

def my_decorate(msg="Not_Hello"):
    
    def decorated(func):
    
        def wrapper(*args, **kwargs):
            print("*****I am decorate1*****")
            func(*args, **kwargs)
            print("  The message is: " + msg)
            print("*****I am decorate2*****")
        return wrapper
    
    return decorated
    

@my_decorate(msg="Hello") # 若使用默认参数仍需要添加圆括号
def print_my_name(name):
    print("  Hello, I am " + name)
    
print_my_name('your_name')

打印结果:

*****I am decorate1*****
Hello, I am your_name
The message is: Hello
*****I am decorate2*****

默认参数很显然, 不再赘述.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值