
正文
包含python函数设计模式的词条
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Python有设计模式么
单例模式:Python 的单例模式最好不要借助类(在 Java 中借助类是因为 Java 所有代码都要写在类中)python函数设计模式,而是通过一个模块来实现。一个模块的模块内全局变量、模块内全局函数python函数设计模式,组合起来就是一个单例对象python函数设计模式了。
模板方法模式:这个可以像其他语言一样实现,但是如果要遵循鸭子类型原则的话,应该删除公有的抽象父类(或接口),从而追求灵活性。
工厂方法模式、多例模式:这个也不用借助类,直接写一个全局函数作为工厂函数即可。因为 Python 中实例化是通过 call 类来完成的,现在改成 call 工厂函数,对客户抠码者是透明的。(从这点我表示理解 Python 没有 new 操作符的好处了,使用通用的 call 定义,正交性极强)
装饰器模式、代理模式:这个接触过 Python 就不会不知道了,Python 内置的 decorator 语法如此著名。装饰器模式和代理模式都可以通过这种方式完成。另外一种是对对象的装饰或代理,这个也不需要按照契约编程的风格,让代理对象实现被代理对象的抽象。一切动态代理,只需要通过重载属性访问操作符,神马都简单了(和 PHP 通过 __get、__set、__call 来实现动态代理很类似)。
原型模式:这个在 Python 中实现的不是那么爽快,需要调用 copy 来克隆原型对象。但是其实有另一种实现方式:之所以使用原型模式,是因为对象初始化需要较大开销。我们只需要保存初始化的结果,并在产生新对象的时候赋予新对象即可。所以,通过元类控制对象被创建的过程,来实现原型模式,也是一种选择。
相关问答
Q1: Python设计模式 - 观察者模式
"""
观察者模式:又叫发布-订阅模式。
它定义了一种一对多的依赖关系,让多个观察者对象同时鉴定某一个主题对象。这个主题对象在状态发生变化时,
会通知所有的观察者对象,使它们能够自动更新自己。
观察者模式所做的工作实际上就是解耦,根据“依赖倒转原则”,让耦合的双方都依赖于抽象,而不是依赖于具体,
从而使得各自的变化都不会影响另一边的变化。
实际场景中存在的问题:现实中实际观察者不一定有实现观察者的通知回调方法。
解决之道:
1、为其封装一个观察类出来,实现相应的接口。
2、修改通知类,让具体观察者的Notify函数直接去调用相应的接口。
"""
class Subject(object):
def __init__(self):
self._observers = []
def attach(self, observer):
if observer not in self._observers:
self._observers.append(observer)
def detach(self, observer):
try:
self._observers.remove(observer)
except ValueError:
pass
def notify(self, modifier=None):
for observer in self._observers:
if modifier != observer:
observer.update(self)
#用法示例
class Data(Subject):
def __init__(self, name=''):
Subject.__init__(self)
self.name = name
self._data = 0
@property
def data(self):
return self._data
@data.setter
def data(self, value):
self._data = value
self.notify()
class HexViewer:
def update(self, subject):
print('十六进制查看器: 主题 %s 有数据 0x%x' % (subject.name, subject.data))
class DecimalViewer:
def update(self, subject):
print('十进制查看器: 主题 %s 有数据 %d' %
(subject.name, subject.data))
# 用法示例...
def main():
data1 = Data('Data 1')
data2 = Data('Data 2')
view1 = DecimalViewer()
view2 = HexViewer()
data1.attach(view1)
data1.attach(view2)
data2.attach(view2)
data2.attach(view1)
print("设置数据1变量 = 10")
data1.data = 10
print("设置数据2变量 = 15")
data2.data = 15
print("设置数据1变量 = 3")
data1.data = 3
print("设置数据2变量 = 5")
data2.data = 5
print("从data1和data2分离HexViewer。")
data1.detach(view2)
data2.detach(view2)
print("设置数据1变量 = 10")
data1.data = 10
print("设置数据2变量 = 15")
data2.data = 15
if __name__ == '__main__':
main()
Q2: python什么是设计模式
Python软件开发中引入设计模式是由生活中的一些实例启发而来的。例如,有2个小朋友Alice和Jack,去麦当劳点餐。Alice不了解麦当劳的套餐模式,于是想了一下,跟服务员说:“我要一个麦辣鸡腿堡、一个薯条和一杯可乐”。而Jack经常吃麦当劳,他也想点和Alice一样的餐品。Jack发现其实Alice点的就是麦当劳的A套餐,于是他直接和服务员说:“给我一个A套餐”。
从上面的事例中可以看出,Jack的点餐效率高,因为Jack和服务员都了解麦当劳的套餐模式,沟通起来效率自然就高。那么在这个生活案例中,创建套餐是提高点餐效率的可重用解决方案。它会根据客户的需求和餐品的被点频次制定出符合不同人群的套餐。套餐可以重复被更多的人去点,因此大大提高了顾客与服务员之间的沟通效率。
同理,在软件开发世界里,本来没有设计模式的,用的人多了,也便总结出了设计模式。这就是设计模式的由来。设计模式针对同一情境,众多软件开发人员经过长时间总结,便得到了最佳可重用解决方案。这个可重用解决方案解决了软件开发过程中常见的问题,拥有固定的术语,因此交流起来就方便了很多。
综上,设计模式是软件开发过程中共性问题的可重用解决方案。设计模式的内涵第一是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。第二是用来解决共性问题。设计模式的外延有:单例模式、工厂模式、适配器模式、代理模式等。据悉,现用的设计模式有24种,随着时代的发展,软件编程可能会遇到新的场景,设计模式会越来越丰富。
先看一个设计模式中最基本的单例模式的例子。Windows里面的任务管理器就是个典型的单例模式软件。这是因为Windows任务管理器只能打开一个,就算用户重复打开,也只能获得一个实例,这不同于word等软件可以打开多个实例。其中的原因就是如果有2个窗口同时都能结束某进程,这就会造成在窗口A中某进程结束了,在窗口B中该进程还保留的;同理反过来,某进程在窗口B中结束了,而在窗口A中还保留着。这样就会造成冲突,系统崩溃。Windows里面的任务管理器符合单例模式,保证一个类仅有一个实例的设计模式。
Q3: python常用的几种设计模式是什么
python常用的几种设计模式有:1、单例模式,确保某一个类只有一个实例;2、工厂模式,使用一个公共的接口来创建对象;3、策略模式,随着策略对象改变内容;4、门面模式,对子系统的封装,使得封装接口不会被单独提出来。
什么是设计模式?
设计模式是一套被反复使用,多数人知道,经过分类编目的代码设计经验总结。
使用设计模式是为了提高代码可重用性,可阅读性,和可靠性。
你说理解的设计模式有几种?
设计模式又可分为三种:创建型(单例模式)、(工厂模式),结构型,行为型(策略模式)
单例模式以及应用场景:
(1)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。Windows的Task Manager(任务管理器)、Recycle Bin(回收站)、网站计数器
(2)单例模式应用的场景一般发现在以下条件下:
资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。如线程池等
要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
工厂模式:
提供一个创建对象的接口,不像客户端暴露创建对象的过程,而是使用一个公共的接口来创建对象。
可以分为三种:简单工厂 工厂方法 抽象工厂
一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
策略模式:
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
要点:把一个个策略,也就是算法封装成一个一个类,任意的替换
解决的问题:避免多个if....else带来的复杂
使用场景:系统中需要动态的在集中算法中动态的选择一种,
门面模式:
门面模式也叫外观模式,定义如下:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。门面模式注重“统一的对象”,也就是提供一个访问子系统的接口。门面模式与之前说过的模板模式有类似的地方,都是对一些需要重复方法的封装。但从本质上来说,是不同的。模板模式是对类本身的方法的封装,其被封装的方法也可以单独使用;而门面模式,是对子系统的封装,其被封装的接口理论上是不会被单独提出来用的。
一个对象有很多行为,如果么有选择合适的设计模式,这些行为就需要用多重的条件判断来实现算法的切换,增加了代码的复杂度。
推荐课程:Python面对对象(Corey Schafer)
关于python函数设计模式和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







