欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python装饰器

程序员文章站 2022-05-02 12:52:01
...

装饰器(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*****

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