IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> AOP设计思想 -> 正文阅读

[Python知识库]AOP设计思想

?Wath:AOP是什么?

- 面向切面编程(Aspect Oriented Programming)一种编程思想

- OOP(面向对象编程)与AOP区别

? - OOP针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分管理。
? - AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果
? - OOP负责抽象和管理,AOP负责解耦和复用
? - OOP面向名词领域,AOP面向动词领域
? - OOP面向纵向,AOP面向横向

AOP术语

术语说明
切面切面泛指交叉业务逻辑。比如事物处理,日志处理就可以理解为切面。
织入织入是指将切面代码插入到目标对象的过程
连接点连接点指切面可以织入的位置
切入点切入点指切面具体织入的位置

Why:为啥要使用AOP?

- 降低业务耦合度
- 提高程序可复用性
- 提高代码可读性,易维护性
- 提高开发效率

Where:什么地方使用AOP?

- 日志记录
- 性能统计
- 安全控制
- 事务处理
- 异常处理
- 多模块调用的公共组件

?How :python中一般怎么使用AOP?

- @ 装饰器
- with上下文管理器

- 案例

? - 打开sql日志,性能分析简易版装饰器

import logging
import time
from functools import partial, wraps

from django.utils.decorators import ContextDecorator

logger = logging.getLogger(__name__)


class SqlLogger(ContextDecorator):
    """
    SQL日志管理
    装饰器用法:
    @SqlLogger
    def 
    """

    def __init__(self, is_open=True):
        self.is_open = is_open
        self.sql_logger = logging.getLogger("django.db.backends")
        self.level = self.sql_logger.level
        self.stream_handler = logging.StreamHandler()

    def __enter__(self):
        if self.is_open:
            self.sql_logger.setLevel("DEBUG")
            self.sql_logger.addHandler(self.stream_handler)

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.is_open:
            self.sql_logger.setLevel(self.level)
            self.sql_logger.removeHandler(self.stream_handler)

def sql_log(func=None):
    if callable(func):
        return SqlLogger()(func)
    else:
        return SqlLogger(func)
      
@sql_log
def test_1():
    from itsm.ticket.models.ticket import Ticket
    Ticket.objects.first()

def fn_performance(
    func=None,
    log=logger,
    threshold=0.5,
    stack_info=False,
    level=logging.DEBUG,
    notify="",
    message="[fn: {fn_name}] [func: {func}] [timer: {time}]",
    show_param=True,
    open_sql=False,
    **kwargs,
):
    if func is None:
        return partial(
            fn_performance,
            log=log,
            level=level,
            message=message,
            notify=notify,
            threshold=threshold,
            stack_info=stack_info,
            show_param=show_param,
            open_sql=open_sql
        )

    @wraps(func)
    def wrapper(*real_args, **real_kwargs):
        t0 = time.time()
        with sql_log(open_sql):
            result = func(*real_args, **real_kwargs)

        interval = round(time.time() - t0, 5)

        nonlocal log
        nonlocal threshold

        log.log(
            level,
            "<Performance Log> {} {} ".format(notify,
                                              message.format(fn_name=func.__name__, time=interval,
                                                             func=func)),
        )

        if interval >= threshold:
            if show_param:
                log.log(
                    logging.WARNING,
                    "The [func_name: {fn_name}] [func: {func}] "
                    "[args:{realfn_args}] [kwargs: {realfn_kwargs}] "
                    "[timer:{time}s] [threshold:{threshold}s], please timely optimize.".format(
                        fn_name=func.__name__,
                        func=func,
                        time=interval,
                        realfn_args=real_args,
                        realfn_kwargs=real_kwargs,
                        threshold=threshold,
                    ),
                    stack_info=stack_info,
                )
            else:
                log.log(
                    logging.WARNING,
                    "The [func_name: {fn_name}] [func: {func}] "
                    "[timer:{time}s] [threshold:{threshold}s], please timely optimize.".format(
                        fn_name=func.__name__, func=func, time=interval, threshold=threshold
                    ),
                    stack_info=stack_info,
                )
        return result

    return wrapper

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:40:12  更:2022-08-06 10:41:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 14:41:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码