笔记:python设计模式

文章目录

  • 概述
  • 什么是设计模式
  • 为什么使用设计模式
  • python设计模式
    • 1. 策略模式
    • 2. 适配器模式
    • 3. 工厂模式
    • 4. 装饰器模式
    • 5. 单例模式
  • 小结

概述

整理网上python设计模式资料并梳理。
来源:

  • 设计模式是什么 http://blog.jobbole.com/62023/
  • python设计模式 https://www.jianshu.com/p/4f4795f2c9b9
  • https://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html

什么是设计模式

  • 按照设计方法理解,就是“套路”,对经常碰到的一些编程问题的可重用解决方案。
  • 按照程序设计的基本概念来理解,就是增加一个抽象层,将程序代码中不变的核心和结构抽取出来。
  • 所以,设计模式的目的就是分离代码中的可变部分,这样不仅会使代码可维护性更高,而且会让代码更易于理解,从而降低开发成本。
  • 这个可变部分,是运行时要求的可变:按照上下文选择程序和数据结构。

为什么使用设计模式

理论上来说,设计模式是经过总结优化的、比较好的解决方案,代表最佳实践。
只要是面向对象编程,设计模式的理念都可以融入;反过来说,如果是面向过程编程则很少使用设计模式,或者说用处不大。(换句话说,OPP很难分离代码中可变部分?有待深入理解)

python设计模式

python是面向对象的编程语言,设计模式可以融入,并且有自身特点。

1. 策略模式

与行为相关的设计模式:允许在运行时根据指定的上下文确定程序的动作。
你可以在两个类中封装不同的算法,并且在程序运行时确定到底执行哪种策略。
例子

class StrategyAndAdapterExampleClass():def __init__(self, context, class_one, class_two):self.context = contextself.class_one = class_oneself.class_two = class_twodef operation1(self):if self.context == "Context_For_Class_One":self.class_one.operation1_in_class_one_context()else:self.class_two.operational_in_class_two_context()

在上面的例子中,策略是根据实例化时context变量的值来决定的。如果给定context变量的值是“class_one”,将会执行class_one,否则就会执行class_two。

2. 适配器模式

一个结构性的设计模式,允许通过不同的接口为一个类赋予新的用途,这使得使用不同调用方式的系统都能够使用这个类。

3. 工厂模式

一个就像工厂那样生产对象实例的类,将可能涉及到很多类的对象创建过程封装到一个单独的方法中。通过给定的上下文输出指定的对象实例。

例子
有一个按钮类,有多种变体,例如图片按钮、输入框按钮或是flash按钮等。在不同的场合需要创建不同的按钮,这时候就可以通过一个工厂来创建不同的按钮。

class Button(object):html = ""def get_html(self):return self.html
class Image(Button):html = "<img alt='' />"
class Input(Button):html = "<input type='text' />"
class Flash(Button):html = ""

然后创建工厂类:

class ButtonFactory():def create_button(self, typ):targetclass = typ.capitalize()return globals()[targetclass]()

globals()将以字典的方式返回所有全局变量,因此targetclass = typ.capitalize()将通过传入的typ字符串得到类名(Image、Input或Flash),而globals()[targetclass]将通过类名取到类的类(见元类),而globals()targetclass将创建此类的对象。

可以这么使用工厂类:

button_obj = ButtonFactory()
button = ['image', 'input', 'flash']
for b in button:print button_obj.create_button(b).get_html()

输出将是所有按钮类型的HTML属性。这样就能根据不同的情况指定不同类型的按钮,且易于重用。

4. 装饰器模式

一个结构性模式,允许根据情况在运行时为一个对象添加新的或附加的行为,目的是为给一个特定的对象实例应用扩展的函数方法,并且同时也能够产生没有新方法的原对象。

5. 单例模式

一个创建型的设计模式,确保运行时对某个类只存在单个实例对象,并且提供一个全局的访问点来访问这个实例对象。
因为对于调用单例的其他对象而言这个全局唯一的访问点“协调”了对单例对象的访问请求,所以这些调用者看到的单例内变量都将是同一份。

小结

  • 习惯于OPP编程,确实很难理解设计模式为什么有用。加了一个抽象层,阅读代码是否更容易,值得商榷。
  • python语言本身的特点,尤其还有eval()函数,选择比较多。可能设计模式真的只适合java这种僵硬的语言(一片“符号的海洋”)。C++应用应该也还好。
  • 装饰器模式可能使用比较频繁。
  • 分离代码中的可变部分是核心,也可以有其它实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里P8架构师谈:分布式、集群、负载均衡、分布式数据一致性的区别与关联

服务器集群&#xff1a; 1.集群概念 集群就是一组相互独立的计算机&#xff0c;通过高速的网络组成一个计算机系统。服务器集群就是指将很多服务器集中起来一起进行同一种服务&#xff0c;在客户端看来就像是只有一个服务器。 2.集群的特点和优势 1&#xff09;高性能 比如…

论文浅尝 | Know-Evolve: Deep Temporal Reasoning for Dynamic KG

论文链接&#xff1a;https://arxiv.org/abs/1705.05742对于事件数据&#xff0c;需要动态更新的知识图谱来保存知识图谱中关系的时许信息。本文提出了 Know-Evolve 这种基于神经网络的动态知识图谱来学习实体在不同时刻的表示。在动态知识图谱中&#xff0c;事件由四元组表示&…

用深度学习(CNN RNN Attention)解决大规模文本分类问题

一、传统文本分类方法 文本分类问题算是自然语言处理领域中一个非常经典的问题了&#xff0c;相关研究最早可以追溯到上世纪50年代&#xff0c;当时是通过专家规则&#xff08;Pattern&#xff09;进行分类&#xff0c;甚至在80年代初一度发展到利用知识工程建立专家系统&…

转:掌握编程

转自&#xff1a;https://www.oschina.net/translate/mastering-programming&#xff0c;有删改 文章目录时间学习超越逻辑风险通过对优秀程序员的多年观察&#xff0c;我观察到了他们工作流程中的某些常见模式。通过对所职教的熟练程序员的几年&#xff0c;我观察到他们缺失这…

对抗学习在NLP中的应用

本文主要串烧了FGSM, FGM, PGD, FreeAT, YOPO, FreeLB, SMART这几种对抗训练方法&#xff0c;希望能使各位大佬炼出的丹药更加圆润有光泽&#xff0c;一颗永流传 简介 对抗训练是一种引入噪声的训练方式&#xff0c;可以对参数进行正则化&#xff0c;提升模型鲁棒性和泛化能力…

阿里P8架构师谈:Docker容器的原理、特征、基本架构、与应用场景

什么是容器&#xff1f; 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &#xff0c;包含软件运行所需的所有内容&#xff1a;代码、运行时环境、系统工具、系统库和设置。 容器化软…

中国电网招聘 计算机岗位

1.解密2018国家电网校园招聘&#xff0c;院校、专业、待遇盲区统统扫除&#xff01; 2018国家电网校园招聘国家电网作为国内乃至世界知名的企业集团&#xff0c;是令无数求职者心仪的工作单位。那么如何才能进国家电网工作呢&#xff1f;国家电网的待遇究竟有传说中的那么好吗&…

系统设计:github上学习如何设计大型系统的项目

https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md 系统设计是一个很宽泛的话题。在互联网上&#xff0c;关于系统设计原则的资源也是多如牛毛。这个仓库就是这些资源的组织收集&#xff0c;它可以帮助你学习如何构建可扩展的系统。

高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型

谈到并发编程就不得不提到NIO&#xff0c;以及相关的Java NIO框架Netty等&#xff0c;并且在很多面试中也经常提到NIO和AIO、同步和异步、阻塞和非阻塞等的区别。我先简短介绍下几个NIO相关的概念&#xff0c;然后再谈NIO重点掌握内容&#xff0c;以及Java NIO框架选型。 高并…

论文浅尝 | 基于神经网络的推理(DeepMind Relational Reasoning)

本文转载自公众号&#xff1a;徐阿衡。论文&#xff1a;A simple neural network module for relational reasoning(2017)github代码: https://github.com/siddk/relation-network这篇回顾下 DeepMind 2017 年发表的关系推理方面的工作&#xff0c;Relational Networks(RNs)。关…

拒绝无脑试错:写给萌新的“科学炼丹”入门手册

近期在订阅号后台和文章评论区review了一下大家的问题&#xff0c;发现很多小伙伴现在已经把机器学习、深度学习的理论基础打好了&#xff0c;但是真正要解决一个现实中的算法问题的时候经常两手抓瞎&#xff0c;一顿毫无目的乱试&#xff0c;甚至认为模型表现不好一定是调参不…

箱线图和散点图叠加图形的绘制——R language

前几日偶然从科学网上看到了一副特别漂亮的统计图形&#xff0c;如下图(摘自博文&#xff1a;http://blog.sciencenet.cn/blog-397960-456174.html)所示&#xff1a;感觉美翻了都&#xff0c;刚好在学习R&#xff0c;又遇到课题组有一些数据要处理&#xff0c;就花了大约一天的…

企业战略咨询方法:学习SWOT分析

文章目录概述分析目标分析内容分析步骤几个例子1. Mbalib网站的SWOT2. 复杂的、全面的SWOT分析3. 一个SWOT矩阵4. 另一个SWOT矩阵5. POWER SWOT分析法概述 SWOT分析是企业战略咨询常用的方法。然而&#xff0c;仔细搜索比对网上资料和各类管理咨询书籍&#xff0c;分析的目标、…

肖仰华 | 知识图谱与认知智能

本文转载自公众号&#xff1a;知识工场。肖仰华教授1万5千字雄文带您深度剖析知识图谱与认知智能&#xff0c;对知识图谱技术与落地应用中的一系列关键问题做了系统梳理与解答。肖仰华博士&#xff0c;复旦大学计算机科学与技术学院教授&#xff0c;博士生导师&#xff0c;知识…

Spring Cloud的核心成员、以及架构实现详细介绍

微服务架构系列 高并发架构系列&#xff1a;服务注册与发现的实现原理、及实现优劣势比较 阿里P8架构师谈&#xff1a;Restful、SOAP、RPC、SOA、微服务之间的区别 阿里P8架构师谈&#xff1a;微服务技术架构、监控、Docker、服务治理等体系 阿里P8架构师谈&#xff1a;Dubb…

调参侠的自我修养——深度学习调参秘籍

这是一篇写给萌新的“科学炼丹”手册 前言 近期在订阅号后台和文章评论区review了一下大家的问题&#xff0c;发现很多小伙伴现在已经把机器学习、深度学习的理论基础打好了&#xff0c;但是真正要解决一个现实中的算法问题的时候经常两手抓瞎&#xff0c;一顿毫无目的乱试&am…

NLP通用模型decaNLP诞生,一个模型搞定十大自然语言常见任务

然而近日&#xff0c;Salesforce发布了一项新的研究成果&#xff1a;decaNLP——一个可以同时处理机器翻译、问答、摘要、文本分类、情感分析等十项自然语言任务的通用模型。Salesforce的首席科学家RichardSocher表示&#xff1a;我们的decaNLP就好比NLP领域的瑞士军刀&#xf…

咨询报告生成:使用python生成pptx格式的报告

已经有人做了&#xff0c;思路和自己想做的一个模式差不多&#xff0c;见模式一&#xff1a; 先做好ppt模板用python计算数据&#xff0c;生成图形用python调用模板&#xff0c;将图形插入pptx页面中&#xff0c;生成分析报告 模式二与模式一的差别在第三步&#xff1a;使用R…

产品技术人必备干货:产品开发流程(完整版)

产品技术开发流程 “ 产品开发流程涉及的人员从产品经理到设计师、前端、后端等等一系列人员&#xff0c;这篇文章主要关于产品开发的完整流程&#xff0c;希望对产品技术人员有一定的参考价值。 一&#xff1a;产品概念设计&#xff1a;MRD 产品开发流程步骤第一步&#xf…

论文浅尝 | 用异源监督进行关系抽取:一种表示学习方法

Citation: Liu, L., Ren, X., Zhu, Q., Zhi, S., Gui, H., Ji, H., & Han, J.(2017). Heterogeneous Supervision for Relation Extraction: A RepresentationLearning Approach. Retrieved from http://arxiv.org/abs/1707.00166动机现有的关系抽取方法严重依赖于人工标注…