前言
1. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局的访问点。
2. 工厂模式(Factory Pattern):定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
3. 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会被自动通知并更新。
4. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,而不会影响到其他对象。
5. 策略模式(Strategy Pattern):定义一系列的算法,将每个算法封装起来,并使它们可以相互替换。
6. 命令模式(Command Pattern):将请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化。
7. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作。
8. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的接口,从而使得子系统更加容易使用。
9. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为。
10. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。
这些是Python中常用的设计模式,通过使用这些设计模式可以提高代码的可读性、可维护性和重用性。
装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加额外的功能,而无需修改其代码。装饰器模式通过创建一系列装饰器类,每个装饰器类都包装了一个具体组件(component)的实例,从而实现透明的、可叠加的功能扩展。
装饰器模式
普通装饰器
def decorator(func):
def new_func(*args,**kwargs):
"do something"
res = func(*args,**kwargs)
"do something"
return res
return new_func
@decorator
def get_name():
pass
带参数装饰器
def new_decorator(pas=""):
def decorator(func):
def new_func(*args,**kwargs):
"do something"
print(pas)
res = func(*args,**kwargs)
"do something"
return res
return new_func
return decorator
@new_decorator('new prams')
def get_name():
pass
缺点
装饰器的用处不用多说,函数校验、进入日志、函数执行前后处理等多场景都需要用到,它也有一点副作用。
def tow_decorator(func):
def new_func(*args, **kwargs):
"""new_func function"""
res = func(*args, **kwargs)
print("do other something")
return res
return new_func
@tow_decorator
def get_name():
"""get_name function"""
print('jjjjjj')
if __name__ == '__main__':
import inspect
print(inspect.signature(get_name))
x = inspect.getsource(get_name)
print(x)
print(get_name.__doc__)
# 结果
(*args, **kwargs) # 函数签名
def new_func(*args, **kwargs): # 函数源码
"""new_func function"""
res = func(*args, **kwargs)
print("do other something")
return res
‘new_func function’ # 函数文档
由于get_name被装饰后指向的是new_func函数,所以获取的信息不再是get_name函数的说明了,对于调试是不方便的。我们可以使用functools模块的wraps函数基本消除这个副作用。
改进
def tow_decorator(func):
@functools.wraps(func)
def new_func(*args, **kwargs):
"""new_func function"""
res = func(*args, **kwargs)
print("do other something")
return res
return new_func
@tow_decorator
def get_name():
"""get_name function"""
print('jjjjjj')
if __name__ == '__main__':
print(get_name.__doc__)
# 结果
()
@tow_decorator
def get_name():
"""get_name function"""
print('jjjjjj')
get_name function
应用场景
- 日志记录: 装饰器可以用于添加日志记录功能,记录函数或方法的调用时间、参数和返回值,以便进行调试或性能分析。
def log_decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print(f"Function {func.__name__} called with arguments {args} and result {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
- 权限检查: 装饰器可以用于检查用户权限,确保只有具有特定权限的用户才能访问某个函数或方法。
def check_permission(permission_required):
def decorator(func):
def wrapper(*args, **kwargs):
if user_has_permission(permission_required):
return func(*args, **kwargs)
else:
raise PermissionError("Permission denied")
return wrapper
return decorator
@check_permission("admin")
def delete_user(user_id):
# 删除用户的逻辑
- 缓存: 装饰器可以用于添加缓存功能,避免重复计算相同输入的函数结果。
def cache_decorator(func):
cache = {}
def wrapper(*args, **kwargs):
key = (args, frozenset(kwargs.items()))
if key not in cache:
result = func(*args, **kwargs)
cache[key] = result
return cache[key]
return wrapper
@cache_decorator
def expensive_operation(x, y):
# 执行具体函数操作
- 性能分析: 装饰器可以用于测量函数或方法的执行时间,以便进行性能分析。
import time
def performance_analysis(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time} seconds to execute")
return result
return wrapper
@performance_analysis
def time_consuming_operation():
# 执行耗时的操作
参考链接:
https://www.cnblogs.com/cwp-bg/p/9547797.html、
原文地址:https://blog.csdn.net/qq_44091004/article/details/135440443
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_54290.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!