利用metaclass实现python的aop

使用Python的元类实现AOP监控类方法调用过程 引言 Python的元类(metaclass)功能强大,能够实现AOP(Aspect-Oriented Programming,面向切面编程)的类似功能,本文以实现监控类方法执行所耗时间为例,参照本文,可以实现记录类方法调用参数和执行结果到日志文件中,统一增加类的方法或属性等看似“不可能”的事情而不用对其它类做修改,达到“高内聚,低耦合”的目的。 什么是元类(metaclass) 阅读详情


修行Python个把星期,终于有点成果了,呵呵,一个利用metaclass实现的aop。

其实python这类非常动态的语言要实现AOP是很容易的,所以首先我们要来先定义一个metaclass

然后我们要在__new__()这个metaclass 的时候动态植入方法到要调用地方法的前后。

具体代码如下:

 1
 2 __author__= " alex "
 3 __date__ = " $2008-12-5 23:54:11$ "
 4 __name__= " pyaop "
 5
 6 '''
 7 这个metaclass是实现AOP的基础
 8 '''
 9 class pyaop(type):
10      '''
11     这个空方法是用来将后面的beforeop和afterop初始化成函数引用
12      '''
13      def nop(self):
14          pass
15      '''
16     下面这两个变量是类变量,也就是存放我们要植入的两个函数的地址的变量
17      '''
18     beforeop=nop
19     afterop=nop
20      '''
21     设置前后两个植入函数的类函数
22      '''
23     @classmethod
24      def setbefore(self,func):
25         pyaop.beforeop=func
26     @classmethod
27      def setafter(self,func):
28         pyaop.afterop=func
29      '''
30     初始化metaclass的函数,这个函数最重要的就是第四个参数,dict通过这个参数我们可以修改类的属性(方法)
31      '''
32      def  __new__(mcl,name,bases,dict):
33          from types  import FunctionType  # 加载类型模块的FunctionType
34         obj=object()  # 定义一个空对象的变量
35          '''
36         这个就是要植入的方法,func参数就是我们要调用的函数
37          '''
38          def aop(func):
39              '''
40             我们用这个函数来代替将要调用的函数
41              '''
42              def wrapper(*args, **kwds):
43                 pyaop.beforeop(obj)  # 调用前置函数
44                 value = func(*args, **kwds)  # 调用本来要调用的函数
45                 pyaop.afterop(obj)  # 调用后置函数
46                  return value  # 返回
47              return wrapper
48          # 在类的成员列表中查找即将调用的函数
49          for attr, value  in dict.iteritems():
50              if isinstance(value, FunctionType):
51                 dict[attr] = aop(value)  # 找到后用aop这个函数替换之
52         obj=super(pyaop, mcl). __new__(mcl, name, bases, dict)  # 调用父类的__new__()创建self
53          return obj
54     

 

使用的时候,如果我们要拦截一个类A的方法调用,就这样子:

 

 1 class A(object):
 2      __metaclass__ = pyaop
 3      def foo(self):
 4         total = 0
 5          for i  in range(100000):
 6             total = total+1
 7          print total
 8
 9      def foo2(self):
10          from time  import sleep
11         total = 0
12          for i  in range(100000):
13             total = total+1
14             sleep(0.0001)
15          print total

 

最后我们只需要:

 

 1 def beforep(self):
 2      print( ' before ')
 3 def afterp(self):
 4      print( ' after ')
 5
 6 if  __name__ ==  " __main__ ":
 7     pyaop.setbefore(beforep)
 8     pyaop.setafter(afterp)
 9     a=A()
10     a.foo()
11     a.foo2()

 这样子在执行代码的时候就得到了如下结果

before
100000
after
before
100000
after

这段代码耗时一天才调通(汗颜),是基于园里另外一贴 http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html 

Python的神奇功能——函数&装饰器&MetaClass Python中的装饰器,会让很多人望而却步。不要被它吓跑,啃下它,其实超有用,也没有想象中难。 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。 Python的装饰器类似于Spring的杀手锏之一 AOP(Aspect Oriented Programming)面向切面的编程。把特别复杂的逻辑功能进行切片分层完成,比如日志记录,在一个函数的调用前后执行,相当于wrapper包装起来; **装饰器分类:函数装饰器,类装饰器。**装饰器通常运用在身份认证、日志记录 阅读详情

相关推荐

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

python aop (metaclass)

代码可以直接运行,看结果如果命令调试 python -m pdb pyaop.py(Pdb)b pyaop:10(Pdb)c(Pdb)n .....自己来把调试参考 :python pdb 基础调试源文件 : pyaop.py #!/usr/bin/python #-*-coding:utf8-*- #参考:http://www.cnbl...

weixin_34259232的博客 216

LTspice第三方SPICE模型集成全流程指南

SPICE模型是电子电路仿真的核心基础,它通过数学方程描述半导体器件的非线性、温度依赖与寄生特性,决定仿真结果是否具备工程可信度。其技术价值在于 bridging 理论参数与实测行为,显著提升电源、电机驱动及逻辑电路设计的一次成功率。典型应用场景包括IGBT开关损耗分析、LDO瞬态响应验证、CMOS逻辑门传播延迟评估等。而LTspice作为轻量级工业级工具,依赖用户主动集成原厂提供的.subckt或.model文本模型——这正是‘LTspice导入SPICE模型’和‘74HC14 SPICE模型’等高频搜索

weixin_33868027的博客 301

用metaclass来实现AOP

meta-programming是AOP实现的经常性手段,而这里要展示的,是利用Python的metaclass能力来实现 AOP。 当a的setx方法被调用时,会被“拦截”,先输出pre...然后是原始setx的方法调用,最后输出post... classMetaAll(type):def__new__(mcl,name,bases,dict):def...

125

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 938

手把手教你学Simulink--基于故障诊断与容错控制的场景实例:电动汽车电机驱动系统的故障检测与隔离

本文介绍了基于Simulink的电动汽车电机驱动系统故障诊断与隔离(FDI)仿真建模方法。通过构建永磁同步电机(PMSM)驱动系统模型,实现了IGBT开路、电流传感器漂移等典型故障的注入与检测。重点阐述了基于观测器的残差生成方法,以及利用Stateflow实现的故障隔离逻辑。仿真结果表明,该系统能在85ms内准确识别故障类型,隔离准确率达97%,并支持容错控制。文章还探讨了AI故障预测、数字孪生等高级应用方向,为电动汽车电驱系统安全提供了完整的仿真解决方案。

MHD0815的博客 961

用metaclass实现AOP风格的Profiler

以下是一段通过metaclass实现Profiler的Python代码,很简单,功能不多,目的是为了展示Python的meta programming的能力,这种能力,无疑是很实用的,而且可以将AOP的方面(aspect)概念发挥的很好!下面的Profiler类(metaclass)就可以将方法的profiling在不同的类中复用。 classProfiler(type):...

183

目前固态激光雷达在机器人领域的应用难点汇总

固态激光雷达在机器人领域面临性能与成本的双重挑战:探测性能上,动态范围不足(60-80dB)导致高/低反射物体识别困难,近距盲区(30-50cm)与长距精度(±3cm)矛盾突出;结构上视场角与点云密度难以平衡,多雷达拼接又带来同步误差。成本方面,核心元件(SPAD/OPA芯片)良率低(<50%)、校准工序复杂,单机成本超200美元。环境适应性上,粉尘附着、振动偏移(±2°)和光衰(1万小时衰减15%)制约可靠性。

start_up_go的博客 481

python入门学习记录之元类type和metaclass的使用

引言:众所周知 python是解释型语言,亦是动态语言,解释型语言和编译型语言的不同在于函数和类的定义是在运行时创建的。 例如有一个user.py和class user(object):,python解释器就会在载入该user.py模块时依次执行,动态创建user类对象 一:python有一个type()函数:该函数的作用可以查看一个类型或变量的类型: type(user):type cla...

msdengxw的博客 686

现代软件开发技术 | 第1章:Spring基础

Spring是一个轻量级Java 开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

知识库搭建ing 455

鸿蒙开发实战项目(九十二):HUAWEI Health血压测量

是华为开发的用于运动健康领域的一个开放平台, 三方APP可以借助HUAWEI Health开放平台提供的。

斌擎科技 1131

python高级学习:动态类Type,元类Metaclass

理解变量 python 如何创建变量 a = 3 python将会执行三步去完成上面这个请求。 1.创建一个对象代表3 2.创建一个变量a,如果a未创建。 3.将变量a与对象3相连接。 可以将变量a看作对象3的一个引用,多个变量可以指向同一个对象,在Python中叫共享引用。 a = 3 b = a 由于共享引用的存在,有一些对象和操作会在原处修改对象。 Python中对象可分为可变类型对象和不可变类型对象。 可变对象:列表,字典 不可变对象:数字,字符串,元组 如果变量b是不可变对象a的引用,对变量名a

weixin_43585712的博客 902

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1268

MetaClass programming in Python

用metaclass来实现AOPhttp://cavingdeep.cnblogs.com/archive/2006/04/28/387175.html Metaclass Programming In Python:Pushing Object Oriented Programming to the Next Levelhttp://gnosis.cx/publish/programming/...

weixin_30329623的博客 80

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python从门到精通(八):元类-01-元类metaclass

本章主要说一点高级的编程技巧,python中也算是比较常用的一种技巧--元类。有点类似于拦截器或AOP的功能

编程是一门实践技术 198

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python解析器原理_Python元类原理深入解析

写作不易,支持原创,如要转载,请标明出处。技术人员的生存环境,需要你我共同维护。首先介绍一篇非常好的知乎文章:https://zhuanlan.zhihu.com/p/60461261?utm_source=wechatMessage_article_bottom然后来谈谈Python的元类编程。首先,我们Python的关于类的关键字有:1.type(一号元类,也叫类生成器。一切的起点,可以用来生...

weixin_39576104的博客 125

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深刻理解Python中的元类(metaclass)

http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程。于是e-satis同学给出了神

韦远科的专栏 1378

python术语中英对照栈图_Python常用技术栈总结

在python的基础上,加入了自己的理解,修改一些错误。最近准备去一线城市谋求发展,所以打算重新整理一下,顺便加深一下记忆。Table of ContentsPython语言特性1 Python的函数参数传递看两个例子:a = 1def fun(a):a = 2fun(a)print a # 1a = []def fun(a):a.append(1)fun(a)print a # [1]所有的...

weixin_39688170的博客 258

Python元编程-动态创建类和实例介绍、使用

动态创建类和实例是 Python 元编程中的一项重要功能,它可以在运行时动态地创建类和实例,从而实现更加灵活、可定制化的编程方式。以下是有关 Python 元编程动态创建类和实例的详细介绍:工作原理:Python 允许在运行时动态地创建类和对象,这是因为 Python 中的类和对象本质上是由 type 类创建而来的。因此,可以使用 type() 函数来动态地创建新的类和对象,可以使用 exec() 函数来执行字符串形式的代码,还可以使用 metaclass 来实现动态创建类的类。

captain 2290

Python的type函数与元类在运行时动态创建类的高级技巧

type函数不仅是查看对象类型的工具,更是动态创建类的关键。元类作为"类的类",通过继承type实现。当定义类时指定metaclass参数,Python会调用元类的__new__和__init__方法进行类构造。例如Django的模型系统就利用元类将数据库字段声明转换为实际的类属性。type函数与元类机制正是实现这一魔法的核心工具,它们允许开发者在程序运行期间灵活地生成和修改类定义。建议遵循三个原则:缓存重复创建的类、使用显式命名而非动态生成、为元类添加清晰的__repr__。

ngfvuz_216的博客 146
上一篇: Redis学习笔记(十一)——Redis持久化
下一篇: QPS PV
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值