任务简单的介绍是: 在新风格对象模型中,Python操作其实是在类中查找特殊方法的(经典对象是在实例中进行操作的),现在需要将一些新风格的实例包装到代理中,,此代理可以选择将一些特殊的方法委托给内部的被包装对象。

代码实施为:

 class Proxy(object):
"""所有代理的基类"""
def __init__(self, obj):
super(Proxy, self).__init__() #少了此补会导致无限递归循环
self._obj = obj def __getattr__(self, attribute):
return getattr(self._obj, attribute) def make_binder(unbound_method):
def wrapper(self, *arg, **kwargs):
return unbound_method(self._obj, *arg, **kwargs)
return wrapper known_proxy_classes = {} def proxy(obj, *specials):
"""工厂函数"""
obj_cls = obj.__class__
key = obj_cls, specials
cls = known_proxy_classes.get(key)
if cls is None:
cls = type("%sProxy" % ob_cls.__name, (Proxy,), {})
for name in specials:
name = '__%s__' % name
unbound_method = getattr(obj_cls, name)
setattr(cls, name, make_binder(unbound_method))
"""缓存之以供进一步使用
known_proxy_classes[key] = cls
"""实例化并返回需要的代理
return cls(obj)

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

  代码运行结果如下图:

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

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

  

在代理中托管特殊方法的python代码实现的更多相关文章

  1. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  2. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

  3. 在eclipse pydev中使用PEP8来规范python代码

    最近在写接口自动话时,代码要上研发的PEP8检查,所以没办法,在pydev中配置如下: 1.打开PEP检查 在pydev 2.3.0之后的版本都自带了pep8检查,但默认是没有开启的 Windows ...

  4. 数据标准化方法及其Python代码实现

    数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间.目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法.标准差法).折线型方法(如三折线法).曲线型方法 ...

  5. OC中如何优化代理是否响应某个方法

    看以下示例代码: if([_delegate respondsToSelector: @selector(someClassDidSomething:)){ [_delegate someClassD ...

  6. 在图像中隐藏数据:用 Python 来实现图像隐写术

    什么是“隐写术”? 隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程.隐写术的目的是保证双方之间的机密交流.与隐藏机密信息内容的密码学不同,隐写术隐瞒了传达消息 ...

  7. Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制

    1.在Eclipse中配置Javah,配置如下 位置是你javah.exe在你电脑磁盘上的路径 位置:C:\Program Files\Java\jdk1.8.0_112\bin\javah.exe ...

  8. 无需操作系统和虚拟机,直接运行Python代码

    Josh Triplett以一个“笑点”开始了他在PyCon 2015上的演讲:移植Python使其无需操作系统运行:他和他的英特尔同事让解释器能够在GRUB引导程序.BIOS或EFI系统上运行.连演 ...

  9. 无需操作系统直接运行 Python 代码

    Josh Triplett以一个“笑点”开始了他在PyCon 2015上的演讲:移植Python使其无需操作系统运行:他和他的英特尔同事让解释器能够在GRUB引导程序.BIOS或EFI系统上运行.连演 ...

随机推荐

  1. [google面试CTCI] 2-1.移除链表中重复元素

    [链表] Q:Write code to remove duplicates from an unsorted linked list      FOLLOW UP      How would yo ...

  2. 教你用Perl 实现Base64编码

    在用脚本后台发送邮件时,需要将html的内容转换成Base64编码的形式,这样邮件客户端会自动对Base64编码的内容进行解码,还原成原来的内容. Base64.pl: #!/usr/bin/perl ...

  3. 上传组件uploadify的使用

    上传组件uploadify的使用 大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用& ...

  4. 实践Scrum

    http://blog.vsharing.com/agiledo/ [原创]敏捷开发实践-我们这样实践Scrum-续(81页) 我们团队实践Scrum,有一些做法和教训,希望和大家分享: 公司背景:通 ...

  5. ios缩放图片

    http://blog.csdn.net/yanfangjin/article/details/7456681

  6. C#私房菜[二][提供编程效率的技巧]

    AaronYang的C#私房菜[二][提供编程效率的技巧] 前言 我的文章简单易懂,能学到东西.因为复杂的东西,讲起来,好累.阅读者只是膜拜,学不到东西,就是没用的东西,好多文章都是看不下去.我写不出 ...

  7. Spring Data Rest 支持Put请求

    最近在用 Spring Data Rest 写WebApi 遇到Put请求后报415 Mieda Type 的错误,GG了下 找到个解决办法,下面是针对Put请求的过滤. 1 public class ...

  8. UML九种图-包图、类图

    UML九种图-包图.类图 一.包 (一)相关概念: 1.包: 一个包=一层=一个命名空间=一个文件夹 2.包的命名: 简单名:王老二 路径名:中国.河北省.廊坊市.廊坊师范学院.信息技术提高班.九期班 ...

  9. Java笔记:内部类

    1.把一个类放在另一类内部定义,这个定义在其他类里面的类就叫做内部类,包含内部类的类叫做外部类.内部类成员可以直接访问外部类的私有数据,但是外部类不能访问内部类的实现细节. 2.非静态内部类(没有st ...

  10. Ubuntu snappy is lame

    ubuntu has just announced that snappy will replace 'apt' as the next generation of package manager f ...