首页 > 编程语言 >python装饰器模式实现切面功能

python装饰器模式实现切面功能

时间:2024-09-10 15:48:10浏览次数:9  
标签:end python start add 切面 time 装饰 def

引言

在软件开发中,我们经常会遇到一些横切关注点(cross-cutting concerns),如日志记录、事务管理、安全性检查等,这些关注点通常会跨越多个模块。传统的编程方式会导致代码的重复和分散,难以维护。面向切面编程(AOP)是一种编程范式,它通过提供一种新的方式来模块化横切关注点,从而提高代码的模块性和可维护性。

什么是切面(AOP):

AOP是一种编程思想,它允许开发者将横切关注点从业务逻辑中分离出来,形成所谓的“切面”(Aspect)。切面可以定义在程序执行的特定点(如方法调用前后)插入额外的逻辑,这些点被称为“连接点”(Join Points)。AOP的主要目标是提高模块化,使得业务逻辑更加清晰,同时减少代码的重复。

在Java中可以使用动态代理,Spring Aop(实际上还是动态代理),AspectJ等手段去实现切面功能。那么在Python 怎么去实现切面呢?就拿一个最简单的例子来说,打印每一个方法的耗时时长。

常规写法

import time
def method1():
    start = time.time()
    # 业务方法
    end = time.time()
    print(f"耗时:{end-start}",)
    
    
def method2():
    start = time.time()
    # 业务方法
    end = time.time()
    print(f"耗时:{end-start}",)

def method3():
    start = time.time()
    # 业务方法
    end = time.time()
    print(f"耗时:{end-start}",)

可以看到随着业务的增加,会增加很多的这样的代码,这样的代码重复率很高,不满足开闭原则,那么可以考虑将这些非业务方法抽取出来做一个公共方法,然后去调用它,那么怎么去实现呢?那就不得不说python中的装饰器模式了。

举一个栗子,老王写了一个加法函数

def laowang_add(x:int,y:int):
    return x+y

当时小王呢,想在求和之前增加一个日志,但是又不想在老王的代码基础上改,那要怎么做呢?可以这样

def laowang_add(x: int, y: int):
    return x + y


def xiaowang_add():
    print("xiaowang  666")
    return laowang_add


add = xiaowang_add()
print(add(1, 2))

那么这样可以在不修改老王的代码基础上做了一次增强,那么如果我想在所有的方法上前去做一次日志输出,那么上述的做法就不适用了,不可能以后新增一个函数都去改一下闭包函数。此时就需要装饰器,也叫切面编程。简单来讲,我把一个代表函数的变量传进闭包函数,然后这个闭包函数就可以自适应传进去的函数,自动调用它,不用每次新增函数都去修改闭包,只用调用一次闭包函数即可。此时装饰器模式就闪亮登场了。

我们只需要增加一个方法

import time
import functools


def log_decoration(func):
    @functools.wraps(func)
    def log(*args, **kwargs):
        print(f"entry {func.__name__} method")
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"end {func.__name__} method cost {end - start}")
        return result

    return log


@log_decoration
def laowang_add(x: int, y: int):
    return x + y
        

输出

entry laowang_add method
end laowang_add method cost 0.0
3

可以看到老王虽然只实现了业务逻辑,但是增加了日志输出,就像该方法被拦截切断了一样,然后自动增加了日志输出,这就是切面,不修改业务方法,只增强业务方法。可以看到func.__name__输出就是调用的方法名,没有小王代替。

标签:end,python,start,add,切面,time,装饰,def
From: https://www.cnblogs.com/lyuSky/p/18406510

相关文章

  • Python 之PyMysql
    Python之PyMysql目录Python之PyMysqlPymysql教程使用教程Pymysql教程介绍:PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库安装pipinstallPyMySQL使用教程#!/usr/bin/envpython#-*-coding:utf-8-*-##@Author:Alex##_____......
  • 基于Python的资产管理系统的设计与实现-附源码201117
    摘 要现代企业管理越来越强调利用有形资产来提供优质服务的能力,即通过资产管理来确保有形资产物尽其用、安全运行,在希望的时间和地点提供需要的设备,同时尽可能地降低运行和维护成本。资产管理系统为企业提供全面、迅速的资产信息,方便管理者了解和操作企业内部的资产管理。......
  • 【Python进阶】学习Python从入门到进阶,详细步骤,就看这一篇。文末附带项目演练!!!
    详细的Python学习路线1.Python基础Python安装和环境配置:学习如何在你的操作系统上安装Python,并配置开发环境。变量和数据类型:学习如何定义变量,以及Python中的基本数据类型,如整数、浮点数、字符串等。Python数据类型运算符和表达式:学习Python中的运算符,如算术运算符、比......
  • 浅谈人工智能之Python调用AutoGen Studio SDK
    浅谈人工智能之Python调用AutoGenStudioSDK引言在之前的文档中我们讲解了如何搭建AutoGenStudio环境以及基于AutoGenStudio构建AIAgent并且进行执行。今天我们介绍如何通过Python调用AutoGenStudio提供的SDK来运行workflow,即AIAgent。实例说明第一步:我们使用命......
  • python学习(一)turtle画图
    一些常用的函数:1)turtle.pensize():设置线条的粗细;2)turtle.speed():设置绘制的速度,1-10,1最慢,10最快;3)turtle.begin_fill():准备开始填充图形;4)turtle.circle(50,steps=3):circle函数在之前用到过,是画一个半径为radius的圆,这里是扩展,steps表示在半径为50的圆内的内置steps多边形;5)t......
  • *Python*机器学习算法——神经网络和深度学习
            神经网络和深度学习是现代机器学习的重要组成部分,它们在图像识别、语音识别、自然语言处理等多个领域取得了显著的成功。本文将详细介绍神经网络和深度学习的基本函数概念,并通过一个简单的例子来展示如何使用Python和Keras库构建一个神经网络模型。1、前置库......
  • 基于Python django旅游网站系统【041】
    基于Pythondjango旅游网站系统【041】【开发工具】1.数据库:mysql2.开发工具:pycharm等python开发工具均可【技术简介】前端bootstrap样式数据存mysqldjango框架【功能说明】1.用户登录注册2.首页展示、热门推荐、猜你喜欢、景点介绍等等3.景点评论、打分、收藏4.旅......
  • 基于python Django音乐网站系统【042】
    基于pythonDjango音乐网站系统【042】【开发工具】1.数据库:mysql2.开发工具:pycharm等python开发工具均可【技术简介】前端bootstrap样式数据存mysqldjango框架【功能说明】1.用户登录2.首页展示、热门推荐、热门下载3.景点评论、打分、收藏4.歌曲详情、歌曲播放、......
  • 分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 sp
    ......
  • 如何通过Python获取一座城市的天气?
    Hello,大家好呀,今天给大家带来一期如何通过Python来获取城市的天气的教程。因为我们需要用到APIKey,所以我们需要注册一个天气服务提供商的官方网站账号这里以和风天气为例。首先,进入和风天气官网用户中心|和风天气(qweather.com)。点击免费注册,输入邮箱和密码。注册完......