用metaclass来实现AOP

meta-programming是AOP实现的经常性手段,而这里要展示的,是利用Python的metaclass能力来实现 AOP。

当a的setx方法被调用时,会被“拦截”,先输出pre...然后是原始setx的方法调用,最后输出post...

class  MetaAll(type):
   def __new__(mcl, name, bases, dict):
      def log(func):
         def f(
* args,  ** kwds):
            print 
' pre %s '   %  func.__name__
            value 
=  func( * args,  ** kwds)
            print 
' post %s '   %  func.__name__
            
return  value
         
return  f
      
for  attr, value  in  dict.iteritems():
         
if  attr.startswith( ' set ' ):
            dict[attr] 
=  log(value)
      
return  super(MetaAll, mcl).__new__(mcl, name, bases, dict)

__metaclass__ 
=  MetaAll

class  A:
   def __init__(self):
      self.__x 
=   1

   def getx(self):
      
return  self.__x

   def setx(self, value):
      self.__x 
=  value

=  A()
a.setx(
2 )
print a.getx()

看到那个__metaclass__变量了吗?如果你赋给它另外一个metaclass的话它会产生其他效应(我这里做的是 logging,其他的可能有例如timing、access control、transaction, etc.),这是魔法!^_^ 最魔力十足的地方是我甚至可以把一个metaclass传进模块中去,给__metaclass__动态的赋值(赋metaclass),这意味着我可以通过meta-programming动态的改变我程序的逻辑,或者不需要改动原有代码即可添加新功能(或修改)等特点!

整个演示就当作抛砖引玉吧,代码我就不细讲了,因为概念太复杂了,不是一两句能说得明白的。有兴趣的朋友可以研究一下Python。; -)

转载于:https://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值