1.函数装饰器
函数装饰器是最常见的装饰器,它的作用是在不改变原函数代码的情况下,为函数添加一些额外的功能,比如日志记录、性能分析等。
例如,下面的代码实现了一个简单的函数装饰器,它记录了函数的执行时间:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time= time.time()
result= func(*args, **kwargs)
end_time= time.time()
print(f"执行时间:{end_time- start_time:.5f}秒")
return result
return wrapper
@timer
def my_function():
time.sleep(1)
print("函数执行完毕")
my_function()
输出:
函数执行完毕执行时间:1.00044秒
2.类装饰器
类装饰器是用来装饰类的,它的作用是在不改变原类定义的情况下,为类添加一些额外的功能,比如给类添加属性、修改类方法等。
例如,下面的代码实现了一个简单的类装饰器,它为类添加了一个名为name的属性:
def add_name(cls):
cls.name= "MyClass"
return cls
@add_name
class MyClass:
pass
print(MyClass.name)
输出:
MyClass
3.属性装饰器
属性装饰器是用来装饰类的属性的,它的作用是在不改变原属性定义的情况下,为属性添加一些额外的功能,比如类型检查、缓存等。
例如,下面的代码实现了一个简单的属性装饰器,它为一个类的属性添加了类型检查:
def type_check(attr_type):
def decorator(func):
def wrapper(self, value):
if not isinstance(value, attr_type):
raise ValueError(f"属性值必须是{attr_type}类型")
func(self, value)
return wrapper
return decorator
class MyClass:
@type_check(int)
def set_value(self, value):
self._value= value
my_object= MyClass()
my_object.set_value(10)
my_object.set_value("Hello") # 抛出异常
输出:
ValueError: 属性值必须是<class 'int'>类型
4.方法装饰器
方法装饰器是用来装饰类的方法的,它的作用是在不改变原方法定义的情况下,为方法添加一些额外的功能,比如权限检查、缓存等。
例如,下面的代码实现了一个简单的方法装饰器,它为一个类的方法添加了缓存:
def cache(func):
cache_dict= {}
def wrapper(self, *args):
key= (func.__name__, args)
if keyin cache_dict:
print("从缓存中获取数据")
return cache_dict[key]
else:
result= func(self, *args)
cache_dict[key] = result
print("计算结果并缓存")
return result
return wrapper
class MyClass:
@cache
def get_value(self, x):
return x ** 2
my_object= MyClass()
print(my_object.get_value(2))
print(my_object.get_value(2))
输出:
计算结果并缓存
4
从缓存中获取数据
4
网友评论