Skynet

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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks


          代碼可以直接運行,看結果
          如果命令調試 python -m pdb pyaop.py
          (Pdb)b pyaop:10
          (Pdb)c
          (Pdb)n .....自己來把
          調試參考 : python pdb 基礎調試


          源文件 : 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方法(靜態方法)set
              @classmethod
              
          def setbefore(self,func):
                  pyaop.beforeop
          =func
              @classmethod
              
          def setafter(self,func):
                  pyaop.afterop
          =func
           
           
             
          """ 使用調試 
             # python -m pdb pyaop.py 
             # 由下面 A類 < __metaclass__ = pyaop > 
             #        類初始 的 __new__ 指向 pyaop __new__ 
             # 
             # (Pdb)b pyaop:36   (大概就是下面函數form types  的行號)
             # (Pdb)a   (可以看看調試中,各參數的值,注意dict為A的初始對象傳過來了)
             #     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>}
             # 本函數目的: 使用 新的另個對象掛載 被aop后的 A對象 方法
             
          """
              
          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


          """#####################################################################################
          #   測試 
          #####################################################################################
          """

          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)
          #結果
          #
          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) 評論(0)  編輯  收藏 所屬分類: python
          主站蜘蛛池模板: 清苑县| 广汉市| 香港 | 莱阳市| 株洲市| 天全县| 华蓥市| 井研县| 鹿邑县| 黄梅县| 古田县| 凌源市| 富宁县| 渑池县| 喀什市| 河源市| 凤城市| 永胜县| 扶余县| 皋兰县| 南漳县| 浪卡子县| 武义县| 乐至县| 涿鹿县| 浦东新区| 南召县| 巴中市| 剑川县| 盈江县| 安康市| 融水| 时尚| 平遥县| 肃北| 阿合奇县| 搜索| 剑阁县| 清镇市| 河源市| 湖北省|