装饰器用法
Python装饰器是一种特殊的函数,用于修改或增强其他函数的功能。装饰器函数本身接收一个函数作为参数,并返回一个新的函数,新函数通常用于包装原始函数。
装饰器常用于以下情况:
1. 记录函数的执行时间或日志信息;
2. 给函数添加缓存功能,以避免重复计算;
3. 给函数添加认证、授权等功能;
4. 修改函数的返回值或异常处理;
5. 以更简洁的方式修改函数的行为等。
装饰器的语法格式如下:
@decorator_function
def my_function():
pass
其中,`decorator_function` 是装饰器函数,`my_function` 是待装饰的函数。使用装饰器时,会将待装饰的函数作为参数传递给装饰器函数,并将装饰器函数的返回值赋值给原始函数。
例如,下面是一个用于计算函数执行时间的装饰器:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")
return result
return wrapper
该装饰器函数接收一个函数作为参数,返回一个新的函数。新函数包装了原始函数,用于计算函数执行时间并输出结果。
使用装饰器时,只需要在待装饰的函数前添加 `@timer` 即可:
@timer
def my_function():
# do something
这样,在每次调用 `my_function()` 时,都会自动计算并输出执行时间。
就是说,上边程序在运行时,不是运行的my_function(),而是运行的wrapper函数
PS:由ChatGPT生成
@classmethod用法
在Python中,`@classmethod` 是一个装饰器,用于定义类方法。类方法是与类相关联而不是与实例相关联的方法。使用 `@classmethod` 装饰器,可以将一个方法声明为类方法,使得它可以直接通过类调用,而无需创建类的实例。以下是一个简单的示例,说明了`@classmethod`的用法:
class MyClass:
class_variable = "I am a class variable"
def __init__(self, instance_variable):
self.instance_variable = instance_variable
@classmethod
def class_method(cls):
print("This is a class method")
print(f"Accessing class variable: {cls.class_variable}")
# 使用类方法,无需创建实例
MyClass.class_method()
在上面的例子中,`class_method` 是一个类方法,通过 `@classmethod` 装饰器进行了声明。它可以通过类直接调用,而无需创建类的实例。类方法的第一个参数通常被命名为 `cls`,用于表示类本身。
值得注意的是,类方法可以访问类变量,但不能直接访问实例变量,因为它没有实例的引用。如果需要访问实例变量,通常会选择使用普通的实例方法。