Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks


          代碼可以直接運(yùn)行,看結(jié)果
          如果命令調(diào)試 python -m pdb pyaop.py
          (Pdb)b pyaop:10
          (Pdb)c
          (Pdb)n .....自己來(lái)把
          調(diào)試參考 : python pdb 基礎(chǔ)調(diào)試


          源文件 : pyaop.py
          #!/usr/bin/python
          #
           -*- coding: utf8 -*-
          #
           參考:http://www.cnblogs.com/Alexander-Lee/archive/2008/12/06/pythonaop.html

          """
          py aop 代理類 ( metaclass 特性 )
             由于使用 __metaclass__ = <type 'type'>
             pyaop 繼承 type
          """
          class pyaop(type):
              
          # before ; after 方法變量引用聲明
              beforeop=lambda e :  None
              afterop
          =lambda e :  None

              
          #class方法(靜態(tài)方法)set
              @classmethod
              
          def setbefore(self,func):
                  pyaop.beforeop
          =func
              @classmethod
              
          def setafter(self,func):
                  pyaop.afterop
          =func
           
           
             
          """ 使用調(diào)試 
             # python -m pdb pyaop.py 
             # 由下面 A類 < __metaclass__ = pyaop > 
             #        類初始 的 __new__ 指向 pyaop __new__ 
             # 
             # (Pdb)b pyaop:36   (大概就是下面函數(shù)form types  的行號(hào))
             # (Pdb)a   (可以看看調(diào)試中,各參數(shù)的值,注意dict為A的初始對(duì)象傳過(guò)來(lái)了)
             #     mcl = <class '__main__.pyaop'>
             #     name = A
             #     bases = (<type 'object'>,)
             #     dict = {'__module__': '__main__', 'foo': <function foo at 0x7fddced4>, '__metaclass__': <class '__main__.pyaop'>, 'foo2': <function foo2 at 0x7fddcf0c>}
             # 本函數(shù)目的: 使用 新的另個(gè)對(duì)象掛載 被aop后的 A對(duì)象 方法
             
          """
              
          def __new__(mcl,name,bases,dict):
                  
          from types import FunctionType 
                  obj
          =object()

                  
          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) 
              
          #掛載到 obj 上 
                  obj=super(pyaop, mcl).__new__(mcl, name, bases, dict) 
                  
          return obj
             

          class A(object):
              
          #被 aop 代理 聲明!
              __metaclass__ = pyaop
              
          def foo(self):
                  total 
          = 0
                  
          for i in range(100000):
                      total 
          = total+1
                  
          print total

              
          def foo2(self):
                  
          from time import sleep
                  total 
          = 0
                  
          for i in range(100000):
                      total 
          = total+1
                      
          #sleep(0.0001)
                  print total


          """#####################################################################################
          #   測(cè)試 
          #####################################################################################
          """

          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()


          其他aop:
          使用 @
          def addspam(fn):
              
          def new(*args):
                  
          print "spam, spam, spam"
              
          return fn(*args)
          return new


          @addspam
          def useful(a, b):
              
          print a**2 + b**2


          useful(
          3,4)
          #結(jié)果
          #
          spam, spam, spam
          #
          25

          晚綁定!
          def attrs(**kwds):
              
          def decorate(f):
                  
          for k in kwds:
                      setattr(f, k, kwds[k])
                  
          return f
              
          return decorate

          @attrs(versionadded
          ="2.2",author="Guido van Rossum")
          def mymethod(f):
              
          return mymethod

          x
          =mymethod(1)
          x.versionadded
          #2.2 !這是什么好東西!!





          整理 www.aygfsteel.com/Good-Game
          posted on 2009-04-08 15:18 劉凱毅 閱讀(1255) 評(píng)論(0)  編輯  收藏 所屬分類: python
          主站蜘蛛池模板: 招远市| 陆河县| 巨鹿县| 富平县| 天峻县| 平安县| 温泉县| 三台县| 郯城县| 搜索| 赤壁市| 涟源市| 卓资县| 永川市| 平顶山市| 兰溪市| 双柏县| 图们市| 托克逊县| 金寨县| 岑巩县| 宝鸡市| 特克斯县| 广灵县| 博兴县| 三台县| 盈江县| 班玛县| 晋中市| 黎城县| 盘山县| 迁安市| 车致| 昌吉市| 正安县| 江陵县| 清河县| 青海省| 永修县| 邯郸市| 乐陵市|