如何正确有效率的实现Python AOP来为我们的程序开发起到一些帮助呢?首先我们要使用metaclass来对这一技术应用进行实现。那么具体的操作步骤将会在这里为大家呈上,希望可以给大家带来些帮助。

10多年的佳木斯网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整佳木斯建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“佳木斯网站设计”,“佳木斯网站推广”以来,每个客户项目都认真落实执行。
其实Python这类非常动态的语言要实现AOP是很容易的,所以首先我们要来先定义一个metaclass
然后我们要在__new__()这个metaclass 的时候动态植入方法到要调用地方法的前后。
具体Python AOP的实现代码如下:
- __author__="alex"
 - __date__ ="$2008-12-5 23:54:11$"
 - __name__="pyAOP"
 - '''
 - 这个metaclass是实现AOP的基础
 - '''
 - class pyAOP(type):
 - '''
 - 这个空方法是用来将后面的beforeop和afterop初始化成函数引用
 - '''
 - def nop(self):
 - pass
 - '''
 - 下面这两个变量是类变量,也就是存放我们要植入的两个函数的地址的变量
 - '''
 - beforeop=nop
 - afterop=nop
 - '''
 - 设置前后两个植入函数的类函数
 - '''
 - @classmethod
 - def setbefore(self,func):
 - pyAOP.beforeop=func
 - @classmethod
 - def setafter(self,func):
 - pyAOP.afterop=func
 - '''
 - 初始化metaclass的函数,这个函数最重要的就是第四个参数,
 
dict通过这个参数我们可以修改类的属性(方法)- '''
 - def __new__(mcl,name,bases,dict):
 - from types import FunctionType #加载类型模块的FunctionType
 - obj=object() #定义一个空对象的变量
 - '''
 - 这个就是要植入的方法,func参数就是我们要调用的函数
 - '''
 - def AOP(func):
 - '''
 - 我们用这个函数来代替将要调用的函数
 - '''
 - def wrapper(*args, **kwds):
 - pyAOP.beforeop(obj) #调用前置函数
 - value = func(*args, **kwds) #调用本来要调用的函数
 - pyAOP.afterop(obj) #调用后置函数
 - return value #返回
 - return wrapper
 - #在类的成员列表中查找即将调用的函数
 - for attr, value in dict.iteritems():
 - if isinstance(value, FunctionType):
 - dict[attr] = AOP(value) #找到后用AOP这个函数替换之
 - obj=super(pyAOP, mcl).__new__(mcl, name, bases, dict)
 
#调用父类的__new__()创建self- return obj
 
使用的时候,如果我们要拦截一个类A的方法调用,就这样子:
- class A(object):
 - __metaclass__ = pyaop
 - def foo(self):
 - total = 0
 - for i in range(100000):
 - totaltotal = total+1
 - print total
 - def foo2(self):
 - from time import sleep
 - total = 0
 - for i in range(100000):
 - totaltotal = total+1
 - sleep(0.0001)
 - print total
 
最后我们只需要:
- def beforep(self):
 - print('before')
 - def afterp(self):
 - print('after')
 - if __name__ == "__main__":
 - pyAOP.setbefore(beforep)
 - pyAOP.setafter(afterp)
 - a=A()
 - a.foo()
 - a.foo2()
 
这样子在执行代码的时候就得到了如下结果
- before
 - 100000
 - after
 - before
 - 100000
 - after
 
以上就是我们对Python AOP的相关内容的介绍。
【编辑推荐】