欢迎访问宙启技术站
智能推送

Python中的装饰器函数是什么,如何使用?

发布时间:2023-06-06 17:06:37

Python中的装饰器函数是一种特殊的函数,可以用来修改、扩展或包装其他函数的功能。装饰器函数本身也是一个函数,接受一个函数或类作为参数,返回一个新的函数或类,通过这个新的函数或类实现对原有函数或类的功能增强。

装饰器函数的作用可以分为以下几个方面:

1. 添加额外的功能:比如记录函数的执行时间、缓存函数的结果、安全认证等。

2. 修改原函数的行为:比如禁止函数执行、修改函数的返回值等。

在Python中,使用定义装饰器函数的语法,可以将一个函数或者类定义成一个装饰器。

下面是一个简单的例子,演示装饰器的使用:

def make_bold(func):
    def bold_wrapper():
        return "<b>" + func() + "</b>"
    return bold_wrapper
 
def make_italic(func):
    def italic_wrapper():
        return "<i>" + func() + "</i>"
    return italic_wrapper
 
@make_bold
@make_italic
def hello():
    return "Hello world"
 
print(hello())

这个例子中,我们定义了两个装饰器函数make_bold和make_italic,它们分别添加了加粗和斜体的功能。同时,我们使用了@符号将这两个装饰器应用到hello函数上,最终得到的结果是"<b><i>Hello world</i></b>"。

装饰器函数的执行顺序是从上到下的。根据装饰器的顺序不同,我们最终得到的结果也会不同。

除了用@符号显示调用装饰器函数外,Python还提供了另外一种方法,如下所示:

decorator_one = make_bold
decorator_two = make_italic

@decorator_one
@decorator_two
def hello():
    return "Hello world"

print(hello())

这个例子中,我们将装饰器函数分别赋值给decorator_one和decorator_two,然后使用这两个装饰器来装饰hello函数。

装饰器函数可以用来修饰任何类型的函数,包括类方法、静态方法和类本身。下面是一个使用装饰器修饰类的例子:

def add_noise(cls):
    class Noisy(cls):
        def __init__(self, name, age):
            self.name = name.upper()
            self.age = age + 1

    return Noisy
 
@add_noise
class Person():
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person('Tom', 25)
print(p.name, p.age)
## 输出 TOM 26

在这个例子中,我们定义了一个装饰器函数add_noise,该装饰器返回了一个新类Noisy。我们使用@符号将这个装饰器应用到Person类上,并将其赋值给p对象。最终的输出结果是TOM 26,说明我们成功地修改了Person类的行为。