装饰器是Python中强大而灵活的功能,用于修改或增强函数或方法的行为。装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的函数,通常用于在不修改原始函数代码的情况下添加额外的功能或行为。这种技术称为元编程,它在许多Python代码中都有广泛的应用。
下面是装饰器的原理和用法:
原理:
- 函数是一等公民:在Python中,函数是一等公民,这意味着你可以将函数作为参数传递给其他函数,也可以从函数中返回函数。
- 装饰器函数:装饰器本身就是一个函数,它接受一个函数作为输入参数,并返回一个新的函数,通常在新函数中修改或增强原始函数的行为。
- "@" 语法糖:Python提供了一种方便的方式来应用装饰器,使用 "@" 符号紧跟在函数定义之前,将装饰器应用于函数。
# 定义一个装饰器函数
def my_decorator(func):
def wrapper():
print("在函数调用之前执行一些操作")
func() # 调用原始函数
print("在函数调用之后执行一些操作")
return wrapper
# 应用装饰器
@my_decorator
def say_hello():
print("Hello, World!")
# 调用被装饰的函数
say_hello()
# 在函数调用之前执行一些操作
# Hello, World!
# 在函数调用之后执行一些操作
# [Finished in 625ms]
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"调用函数 {func.__name__},参数: {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"函数 {func.__name__} 执行完毕,结果: {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
result = add(2, 3) #装饰器会记录函数的调用和结果
# 调用函数 add,参数: (2, 3), {}
# 函数 add 执行完毕,结果: 5
# [Finished in 578ms]
import time
def performance_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执行时间: {end_time - start_time} 秒")
return result
return wrapper
@performance_decorator
def slow_function():
time.sleep(2)
slow_function()
# 函数 slow_function 执行时间: 2.0054738521575928 秒
@classmethod
装饰器: # Python标准库中包含一些有用的内置装饰器
@classmethod
装饰器用于定义类方法,这些方法第一个参数是类本身(通常命名为cls
),可以通过类名或实例调用。- 类方法通常用于执行与类相关的操作,但不依赖于特定实例的状态。
class Person:
total_people = 0
def __init__(self, name):
self.name = name
Person.total_people += 1
@classmethod
def get_total_people(cls):
return cls.total_people
p1 = Person("Alice")
p2 = Person("Bob")
total = Person.get_total_people()
@staticmethod
装饰器: #Python标准库中包含一些有用的内置装饰器
@staticmethod
装饰器用于定义静态方法,这些方法与类的实例无关,可以通过类名直接调用,不需要创建类的实例。- 静态方法通常用于执行与类相关但不依赖于实例状态的操作。
class MathUtility:
@staticmethod
def add(a, b):
return a + b
result = MathUtility.add(2, 3)
这些内置装饰器允许你更灵活地定义类中的方法,静态方法用于独立于实例的操作,而类方法用于与类相关的操作。它们提供了一种方便的方式来组织和访问与类关联的函数。