python委托模式详细解释
收集了网上的三个例子,然后做了些注释:
#!/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]
- 在
__init__(self,obj)
方法中传入一个被委托对象。 - 通过重写
__getattr__(self,item)
方法,拦截外部对象的属性调用 在
__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委托模式详细解释相关推荐
- Python __name__ == ‘__main__’详细解释-Python零基础入门教程
目录 一.简介 1.__name__ 2.'__main__' 3.__name__ == '__main__' 二.作用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习 ...
- 吴恩达机器学习 神经网络 作业1(用已经求好的权重进行手写数字分类) Python实现 代码详细解释
整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...
- 吴恩达机器学习 逻辑回归 作业3(手写数字分类) Python实现 代码详细解释
整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...
- 吴恩达机器学习 逻辑回归 作业2(芯片预测) Python实现 代码详细解释
整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...
- 「Python」ubuntu使用make命令安装python(带详细解释和防坑指南)
1. 从官网下载Python包 官网链接:Python 从上面链接选择一个python版本,下载压缩包 2. 解压Python压缩包 随便解压在什么位置,因为最终会安装在另一个目录,所以解压的文件夹随 ...
- python列表平均值函数_如何计算列表的平均值-统计信息和Python的均值函数详细解释
python列表平均值函数 Mathematics and programming go hand in hand. If you are a programmer, at some point yo ...
- Python精讲Numpy基础,大牛笔记详细解释
https://www.toutiao.com/a6664936105076326920/ 总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Pyth ...
- Python:非常详细的解释如何判断某个变量的类型以及代码实现
Python:非常详细的解释如何判断某个变量的类型以及代码实现 目录 非常详细的解释如何判断某个变量的类型以及代码实现 非常详细的解释如何判断某个变量的类型以及代码实现 #判断变量类型的函数 def ...
- Python之pandas:pandas.set_option函数的参数详细解释
Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...
最新文章
- [HNOI 2011]XOR和路径
- 2.使用windows下的client连接虚拟机上的oracle连不上的时候的解决方式
- nyoj 685查找字符串
- 【Python3.6】之在Windows中安装Python3.6.1
- HBase读写流程、flush、文件合并、region拆分
- mysql常见问题记录
- 【340天】我爱刷题系列099(2018.01.11)
- wireshark https_测开日常积累-wireshark应用
- 开源公司 HashiCorp 国内险遭禁,阿里、华为也要做好 B 计划?
- C#虚基类继承与接口的区别
- java中struts2框架,概述Java的struts2框架
- java 自动发微博_使用node搭建自动发图文微博机器人
- truffle框架安装(还是比较麻烦的。。。)
- mysql netcdf_NetCDF Overview
- Latex之添加删除线
- 风险投资VC对ESG指标的影响
- igfxpers.exe
- 用python处理excel 数据分析_数据分析---用python处理excel
- android 5.0 刷机教程,一加手机怎么升级安卓5.0系统?一加手机刷Android 5.0教程
- pass by value 与pass by reference 小结
热门文章
- android app自动更新界面_Android自定义view之模仿登录界面文本输入框(华为云APP)...
- 控制台一直报错, [WDS] Disconnected!
- ROS:Nvidia Jetson TK1开发平台
- ML二:python批量修改文件名-测试KDTree
- spring 整合 mybatis 中数据源的几种配置方式
- Handler源码剖析
- Python之路---------Python介绍
- 【乐畅】工作积累 ---- 调节音量大小 (滑动条调节音量大小并保存起来 )
- 搭建基于spring MVC框架 + RESTful架构风格技术总结
- 【Linux】 诊断工具-strace