Python适配器模式代码实现解析


Posted in Python onAugust 02, 2019

Python适配器模式,代码,思考等

# -*- coding: utf-8 -*-
# author:baoshan
class Computer:
  def __init__(self, name):
    self.name = name
  def __str__(self):
    return 'the {} computer'.format(self.name)
  def execute(self):
    return 'executes a program'
class Synthesizer:
  def __init__(self, name):
    self.name = name
  def __str__(self):
    return 'the {} synthesizer'.format(self.name)
  def play(self):
    return 'is playing an electronic song'
class Human:
  def __init__(self, name):
    self.name = name
  def __str__(self):
    return '{} the human'.format(self.name)
  def speak(self):
    return 'says hello'
class Adapter:
  def __init__(self, obj, adapted_methods):
    self.obj = obj
    self.__dict__.update(adapted_methods)
def __str__(self):
    return str(self.obj)
def main():
  objects = [Computer('Asus')]
  synth = Synthesizer('moog')
  objects.append(Adapter(synth, dict(execute=synth.play)))
  human = Human('Bob')
  objects.append(Adapter(human, dict(execute=human.speak)))
  for i in objects:
    print('{} {}'.format(str(i), i.execute()))
if __name__ == '__main__':
  main()

代码输出:

the Asus computer executes a program
the moog synthesizer is playing an electronic song
Bob the human says hello

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

我们设法使得Human和Synthesizer类与客户端所期望的接口兼容,且无需改变它们的源代码。这太棒了!

这里有一个为你准备的挑战性练习,当前的实现有一个问题,当所有类都有一个属性name时,以下代码会运行失败。

for i in objects:
    print('{}'.format(i.name))

首先想想这段代码为什么会失败?虽然从编码的角度来看这是有意义的,但对于客户端代码来说毫无意义,客户端不应该关心“适配了什么”和“什么没有被适配”这类细节。我们只是想提供一个统一的接口。该如何做才能让这段代码生效?

思考一下如何将未适配部分委托给包含在适配器类中的对象。

答案如下:

将适配器类更改如下,增加一行代码

class Adapter:
  def __init__(self, obj, adapted_methods):
    self.obj = obj
    self.__dict__.update(adapted_methods)
    self.name = obj.name
  def __str__(self):
    return str(self.obj)

然后在main函数中获取对应的name,如下

def main():
  objects = [Computer('Asus')]
  synth = Synthesizer('moog')
  objects.append(Adapter(synth, dict(execute=synth.play)))
  human = Human('Bob')
  objects.append(Adapter(human, dict(execute=human.speak)))
  for i in objects:
    print('{} {}'.format(str(i), i.execute()))
    print('{}'.format(i.name))
if __name__ == '__main__':
  main()

输出结果如下:

the Asus computer executes a program
Asus
the moog synthesizer is playing an electronic song
moog
Bob the human says hello
Bob

参考自:《精通Python设计模式》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈django model postgres的json字段编码问题
Jan 05 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
如何使用Python自动控制windows桌面
Jul 11 Python
python 执行终端/控制台命令的例子
Jul 12 Python
利用Python复制文件的9种方法总结
Sep 02 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
详解scrapy内置中间件的顺序
Sep 28 Python
Python headers请求头如何实现快速添加
Nov 03 Python
浅析Python的命名空间与作用域
Nov 25 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 Python
Python中with上下文管理协议的作用及用法
Mar 18 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 #Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 #Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 #Python
Flask框架钩子函数功能与用法分析
Aug 02 #Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 #Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 #Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 #Python
You might like
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHP可变函数的使用详解
2013/06/14 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Python爬虫开发与项目实战
2020/12/16 Python
入党转预备思想汇报
2014/01/07 职场文书
初三政治教学反思
2014/01/30 职场文书
实验心得体会
2014/09/05 职场文书
投资意向协议书
2015/01/29 职场文书
个人年终总结结尾
2015/03/06 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
mysql sql常用语句大全
2022/06/21 MySQL