在代理中託管特殊方法的python代碼實現

來源:互聯網
上載者:User

標籤:

任務簡單的介紹是: 在新風格物件模型中,Python操作其實是在類中尋找特殊方法的(經典對象是在執行個體中進行操作的),現在需要將一些新風格的執行個體封裝到代理中,,此代理可以選擇將一些特殊的方法委託給內部的被封裝對象。

代碼實施為:

 1 class Proxy(object): 2     """所有代理的基類""" 3     def __init__(self, obj): 4         super(Proxy, self).__init__()  #少了此補會導致無限遞迴迴圈 5         self._obj = obj 6      7     def __getattr__(self, attribute): 8         return getattr(self._obj, attribute) 9 10 11 def make_binder(unbound_method):12        def wrapper(self, *arg, **kwargs):13            return unbound_method(self._obj, *arg, **kwargs)14        return wrapper15 16 17 known_proxy_classes = {}18 19 20 def proxy(obj, *specials):21     """工廠函數"""22     obj_cls = obj.__class__23     key = obj_cls, specials24     cls = known_proxy_classes.get(key)25     if cls is None:26         cls = type("%sProxy" % ob_cls.__name, (Proxy,), {})27         for name in specials:28             name = ‘__%s__‘ % name29             unbound_method = getattr(obj_cls, name)30             setattr(cls, name, make_binder(unbound_method))31        """緩衝之以供進一步使用32        known_proxy_classes[key] = cls33      """執行個體化並返回需要的代理34     return cls(obj)        

  代理(以及自動裝載)都得歸功於__getattr__機制,在查詢任何屬性時,(包括方法,python並不區分兩者),python都會自動調用__getattr__。

  代碼運行結果如:

    其實結果很容易理解,就是通過特殊方法代理實現子類方法的代理,例如上面執行個體,由於代理了list中的len和iter,那麼可以實現方法len以及迭代,沒有代理geiitem方法,那麼在利用index時就會報錯。

  在新風格對象中,python操作並不會在啟動並執行時候尋找特殊方法:它們依賴於類對象的“槽”。而這些槽會在對象被建立或者修改的時候更新,因此,對於一個代理對象,如果它要把特殊方法託管給被封裝的對象,它本身必須屬於某個量身定做的類。

  

在代理中託管特殊方法的python代碼實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.