zoukankan      html  css  js  c++  java
  • 在代理中托管特殊方法的python代码实现

    任务简单的介绍是: 在新风格对象模型中,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 wrapper
    15 
    16 
    17 known_proxy_classes = {}
    18 
    19 
    20 def proxy(obj, *specials):
    21     """工厂函数"""
    22     obj_cls = obj.__class__
    23     key = obj_cls, specials
    24     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__' % name
    29             unbound_method = getattr(obj_cls, name)
    30             setattr(cls, name, make_binder(unbound_method))
    31        """缓存之以供进一步使用
    32        known_proxy_classes[key] = cls
    33      """实例化并返回需要的代理
    34     return cls(obj)        

      代理(以及自动托管)都得归功于__getattr__机制,在查询任何属性时,(包括方法,python并不区分两者),python都会自动调用__getattr__。

      代码运行结果如下图:

        其实结果很容易理解,就是通过特殊方法代理实现子类方法的代理,例如上面实例,由于代理了list中的len和iter,那么可以实现方法len以及迭代,没有代理geiitem方法,那么在利用index时就会报错。

      在新风格对象中,python操作并不会在运行的时候查找特殊方法:它们依赖于类对象的“槽”。而这些槽会在对象被创建或者修改的时候更新,因此,对于一个代理对象,如果它要把特殊方法托管给被封装的对象,它本身必须属于某个量身定做的类。

      

  • 相关阅读:
    redis发布订阅
    CSS 布局
    CSS 布局
    CSS Float(浮动)实例
    CSS 布局
    CSS Float(浮动)
    CSS Position(定位)实例
    CSS Position(定位)
    CSS Display(显示) 与 Visibility(可见性)实例
    CSS Display(显示) 与 Visibility(可见性)
  • 原文地址:https://www.cnblogs.com/kirago/p/4764413.html
Copyright © 2011-2022 走看看