收集了网上的三个例子,然后做了些注释:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-class Wrapper:def __init__(self, obj):self.wrapper = objprint self.wrapperprint type(self.wrapper)print"-"*100def __getattr__(self, item):print("trace:", item)return getattr(self.wrapper, item)if __name__ == '__main__':x = Wrapper([1, 2, 3, 4])x.append(35)x.remove(2)print(x.wrapper)  # [1,3,4,35]
  1. __init__(self,obj)方法中传入一个被委托对象。
  2. 通过重写__getattr__(self,item)方法,拦截外部对象的属性调用
  3. __getattr__(self,item)中,将拦截到的属性,让被委托对象去使用。

    python 中的属性概念,和Java中的属性概念是不同的。Java中的属性,就是指类中定义的成员变量,绝对不包含方法。而在python中,任何能以obj.xx形式调用的东西,全部可以称为属性。无论是方法,还是变量,还是对象。

所以上述代码中调用x.append(N),实际上是让x的属性wrapper去调用append(N)方法。

上面传入的参数是[1,2,3,4],是一个list类型的对象,该对象自然可以调用append remove这些方法。

这个转载自:

http://blog.csdn.net/DucklikeJAVA/article/details/73729212

---------------------------------------------------------------------------------------------------------------

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class A:def f_one(self, x):print"here is f_one"print"x=",xprint"-"*100def f_two(self):print"here is f_two"print"-"*100class B(A):def __init__(self):self._a = A()#也就是说在类B中有个成员变量例化了类A,_a是A的对象,不要太在意_a这个奇怪的名字def f_one(self, x):return self._a.f_one(x)def f_two(self):return self._a.f_two()def f_three(self):print"Here is B(A)"
if __name__ == '__main__':b_test=B()x=6b_test.f_one(x)b_test.f_two()

这就是一个最简单的委托,将A的实例在B类中生成,并且转化为B的一个私有属性,当我们需要访问A的属性的时候,加入我们只暴露B出来,这时候就只能通过B类来访问A类,这就达到了委托的效果。

上面的这种方法使用情景为:有几个方法需要委托,当我们需要大量委托的时候这显然不是一个好办法,这时候还有另一个更巧妙的方法:getattr()方法,下面请看代码:

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class A:def f_one(self, x):print"here is f_one"print"x=",xprint"-"*100def f_two(self):print"here is f_two"print"-"*100class B(A):def __init__(self):self._a = A()def f_three(self):passdef __getattr__(self, name):#相当于重写了__getattr__,利用__getattr_来实现委托的效果(其实委托就是甩锅的意思啦,B搞不定,甩锅给A)return getattr(self._a, name)
if __name__ == '__main__':b_test=B()x=6b_test.f_one(x)b_test.f_two()

这里要注意一下这个新的方法,这个方法的作用是用来查找所有的属性,放在这里时,如果代码中尝试访问这个类中不存在的属性时,会去调用实例_a中的属性,这样就可以实现大量的代理。

python委托模式详细解释相关推荐

  1. Python __name__ == ‘__main__’详细解释-Python零基础入门教程

    目录 一.简介 1.__name__ 2.'__main__' 3.__name__ == '__main__' 二.作用 三.猜你喜欢 ​ 零基础 Python 学习路线推荐 : Python 学习 ...

  2. 吴恩达机器学习 神经网络 作业1(用已经求好的权重进行手写数字分类) Python实现 代码详细解释

    整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...

  3. 吴恩达机器学习 逻辑回归 作业3(手写数字分类) Python实现 代码详细解释

    整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...

  4. 吴恩达机器学习 逻辑回归 作业2(芯片预测) Python实现 代码详细解释

    整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...

  5. 「Python」ubuntu使用make命令安装python(带详细解释和防坑指南)

    1. 从官网下载Python包 官网链接:Python 从上面链接选择一个python版本,下载压缩包 2. 解压Python压缩包 随便解压在什么位置,因为最终会安装在另一个目录,所以解压的文件夹随 ...

  6. python列表平均值函数_如何计算列表的平均值-统计信息和Python的均值函数详细解释

    python列表平均值函数 Mathematics and programming go hand in hand. If you are a programmer, at some point yo ...

  7. Python精讲Numpy基础,大牛笔记详细解释

    https://www.toutiao.com/a6664936105076326920/ 总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Pyth ...

  8. Python:非常详细的解释如何判断某个变量的类型以及代码实现

    Python:非常详细的解释如何判断某个变量的类型以及代码实现 目录 非常详细的解释如何判断某个变量的类型以及代码实现 非常详细的解释如何判断某个变量的类型以及代码实现 #判断变量类型的函数 def ...

  9. Python之pandas:pandas.set_option函数的参数详细解释

    Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...

最新文章

  1. [HNOI 2011]XOR和路径
  2. 2.使用windows下的client连接虚拟机上的oracle连不上的时候的解决方式
  3. nyoj 685查找字符串
  4. 【Python3.6】之在Windows中安装Python3.6.1
  5. HBase读写流程、flush、文件合并、region拆分
  6. mysql常见问题记录
  7. 【340天】我爱刷题系列099(2018.01.11)
  8. wireshark https_测开日常积累-wireshark应用
  9. 开源公司 HashiCorp 国内险遭禁,阿里、华为也要做好 B 计划?
  10. C#虚基类继承与接口的区别
  11. java中struts2框架,概述Java的struts2框架
  12. java 自动发微博_使用node搭建自动发图文微博机器人
  13. truffle框架安装(还是比较麻烦的。。。)
  14. mysql netcdf_NetCDF Overview
  15. Latex之添加删除线
  16. 风险投资VC对ESG指标的影响
  17. igfxpers.exe
  18. 用python处理excel 数据分析_数据分析---用python处理excel
  19. android 5.0 刷机教程,一加手机怎么升级安卓5.0系统?一加手机刷Android 5.0教程
  20. pass by value 与pass by reference 小结

热门文章

  1. android app自动更新界面_Android自定义view之模仿登录界面文本输入框(华为云APP)...
  2. 控制台一直报错, [WDS] Disconnected!
  3. ROS:Nvidia Jetson TK1开发平台
  4. ML二:python批量修改文件名-测试KDTree
  5. spring 整合 mybatis 中数据源的几种配置方式
  6. Handler源码剖析
  7. Python之路---------Python介绍
  8. 【乐畅】工作积累 ---- 调节音量大小 (滑动条调节音量大小并保存起来 )
  9. 搭建基于spring MVC框架 + RESTful架构风格技术总结
  10. 【Linux】 诊断工具-strace