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类的行为。
