python面试设计模式问题_聊聊 Python 面试最常被问到的几种设计模式(下)

1. 前言

上篇文章 写到了 Python 最常用的 2 种设计模式,单例模式和工厂模式

本篇文章我们继续聊聊面试中,Python 面试经常被问到的设计模式,即:

构建者模式

代理模式

观察者模式

2. 构建者模式

构建者模式,是将一个复杂对象的构造与表现进行分离,利用多个步骤进行创建,同一个构建过程可用于创建多个不同的表现

简单来说,就是将一个复杂对象实例化的过程,按照自己的想法,一步步设置参数,定制一个我们需要的对象

构建者模式一般由 Director(指挥官)和 Builder(建设者)构成

其中:

Builder 用于定义目标对象部件的方法和参数

Director 用于构造一个 Builder 的接口,由 Director 去指导 Builder 生成一个复杂的对象

以购买一辆车( 包含:准备钱、看车、试驾、购买 4 个步骤)为例

首先,定义一个车的实体,并定义属性变量

class Car(object):

def __init__(self):

# 准备的钱

self.money = None

# 去哪里看车

self.address = None

# 试驾什么车

self.car_name = None

# 购买时间是

self.buy_time = None

def __str__(self):

return "准备了:%s,去%s看车,试驾了%s,下单了,购买时间是:%s" % (self.money, self.address, self.car_name, self.buy_time)

然后,创建一个 Builder,实例化一个 Car 对象;针对上面 4 个步骤,通过定义 4 个方法

分别是:准备多少钱、去哪里看车、试驾什么车、下单购买的时间

# 创建者

class CarBuilder(object):

def __init__(self):

self.car = Car()

def ready_money(self, money):

"""

准备的金额

:param money:

:return:

"""

self.car.money = money

sleep(0.5)

return self

def see_car(self, address):

"""

去哪里看车

:param address:

:return:

"""

self.car.address = address

sleep(0.5)

return self

def test_drive(self, car_name):

"""

试驾了什么车

:param car_name:

:return:

"""

self.car.car_name = car_name

sleep(0.5)

return self

def buy_car(self, buy_time):

"""

下单时间

:param buy_time:

:return:

"""

self.car.buy_time = buy_time

sleep(0.5)

return self

接着,创建 Director,创建 build 方法,使用 Builder 一步步构建一个车对象并返回

class Director(object):

def __init__(self):

self.builder = None

def build(self, builder):

self.builder = builder

self.builder. \

ready_money("100万"). \

see_car("4S店"). \

test_drive("奥迪Q7"). \

buy_car("2020年8月1日")

# 返回构建的对象

return self.builder.car

最后使用的时候,只需要实例化一个 Builder 对象和 Director 对象,然后通过 Director 对象构建一个车对象即可

if __name__ == '__main__':

# 实例化一个构建者对象

car_builder = CarBuilder()

# 实例化一个负责人

director = Director()

# 构建的对象

car = director.build(car_builder)

print(car)

3. 代理模式

代理模式,会引入一个代理对象以代替真实的对象,解耦调用方和被调用方之间的联系

Python 中的实现方式也简单易懂

首先,我们定义一个真实对象实体类,并定义一个方法

class RealObject(object):

"""

实际对象

"""

def __init__(self, arg):

self.arg = arg

def foo(self):

print('参数值为:', self.arg)

然后,创建一个代理对象,在初始化函数 init 中拿到真实对象的实例,定义一个相同的方法,并调用真实对象的方法

class ProxyObject(object):

"""

代理对象

"""

def __init__(self, real_object):

self.real_object = real_object

def foo(self):

# 实际对象调用

self.real_object.foo()

最后的使用方式如下:

if __name__ == '__main__':

# 实例化代理对象

proxy_object = ProxyObject(RealObject('AirPython'))

# 调用方法

proxy_object.foo()

如此,就实现了代理替换真实对象的目的

4. 观察者模式

观察者模式在 Python 中很常见,会定义了对象之间的一对多依赖关系,当被观察者(也称为主体对象)改变状态时,其他所有观察者都会收到事件并处理预定的事情

首先,我们创建一个观察者,在初始化函数中注册到被观察对象上,并且自定义一个更新函数

# 观察者

class Observer(object):

def __init__(self, subject):

# 初始化观察者,并注册

subject.register(self)

def update(self, arg1):

"""获取通知"""

print('观察者收到监听消息,参数为:', arg1)

然后,新建一个被观察对象,创建注册观察者、注销观察者方法

class Subject(object):

def __init__(self):

# 所有的观察者

self.observers = []

self.foo = None

def register(self, observer):

"""添加观察者"""

if observer not in self.observers:

self.observers.append(observer)

else:

print('已经存在,添加失败!')

def unregister(self, observer):

"""注销观察者"""

try:

self.observers.remove(observer)

except ValueError:

print('注销观察者失败')

接着,通过模拟修改变量的值,通知给所有的观察者

def notify(self):

"""通知所有的观察者"""

for item in self.observers:

item.update(self.foo)

def modify_value(self):

"""

修改变量的值

:return:

"""

self.foo = "公众号:AirPython"

# 修改后,通知所有观察者

self.notify()

最后的使用方式如下:

if __name__ == '__main__':

# 主体对象

subject = Subject()

# 观察者

observer = Observer(subject)

# 测试

subject.modify_value()

5. 最后

这两篇一共介绍了 5 种设计模式,它们在 Python 的各领域中被广泛使用,也是面试中最常被问到的几种设计模式

我已经将文中全部源码上传到后台,关注公众号后回复「 设计模式 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

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

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

相关文章

vscode安装swift插件_使用 Webpack 优化 VS Code 插件加载性能

Webpack 这一 JS 模块打包神器相信大家都不陌生了。由于 VS Code 插件大部分也都是 JS/TS 代码 依赖库的形式,因此也可以使用 Webpack 打包,优化性能。经过实测,经过 Webpack 打包优化后的插件,其加载耗时可缩短几倍甚至数十倍之…

全国战争linux添加eth0,linux服务器双线路接入配置

linux服务器双线路接入配置现在有两个专线外接进来分别是移动IP:218。204。242。XXX和电信IP:124。172。245。XXX服务器的地址eth0和eth1的地址分别是:移动IP:218。204。242。XXX和电信IP:124。172。245。XXXDEVICEeth…

c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...

谁说没有智力不能玩RPG?近日,一款名为《超级猎杀》的生存RPG地图在诸多暴雪主播的相继挑战下进入了玩家们的眼帘,要说其中哪位的操作堪称"迷幻"之最,或许No总排第二没人敢称第一。这位菜的同时又自诩无敌的"断智法…

linux 命令行模式自动登录,实现linux的自动登录--命令行模式启动

linux的登录主要是由两个文件在控制,/usr/sbin/getty来获得用户名,并进行检查用户名是否存在,然后将用户名传递给/usr/bin/login来获取用户输入密码和检查密码是否正确.所以要实现linux的自动登录,就要改动这两个文件.1.getty实现的主要功能是:1)打开指定的tty;2)提示用户登录(…

centos7 修改为任意网卡名_centos7首次启动需要配置的内容

前言用户需安装centos图形化界面或命令行界面安装centos7命令行界面,我为大家整理好了,请点击以下链接,亲测N次没问题!![https://blog.csdn.net/zkzbhh/article/details/78145708](https://blog.csdn.net/zkzbhh/artic…

python将图片存入数据库_使用python把图片存入数据库

一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库。今天我们采用的是pythonmysql的方式MYSQL 是支持把图片存入数据库的,也相应的有一个专门的字段 BLOB…

linux播放到设备,linux - 将字节流式传输到ALSA播放设备 - 堆栈内存溢出

我在使用libasound将随机字节写入ALSA播放设备时遇到了很多麻烦。 最终,我的目标是能够通过网络路由回放流并让它在远程设备上播放。此问题中提供的代码将WAV文件读入内存并通过snd_pcm_writei将其写入驱动程序并且可以正常工作。 但是,这段代码与我正在…

vue实现一个带搜索功能的列表_(Vue起步)2.模板指令:v-for / v-on / v-model

①公众号:王酱酱记②记录跟着文档学习Vue的一些关键点,持续更新。感兴趣的小白建议关注一下③Vue当中有几个常见的指令,看看是怎么用的,强烈建议你自己在编辑器里打一遍,你就更明白Vue为什么是数据驱动型的一款框架啦&…

python读取windows日志_Python解析windows系统日志文件

DOM是Document Object Model的简称,XML 文档的高级树型表示。该模型并非只针对 Python,而是一种普通XML 模型。Python 的 DOM 包是基于 SAX 构建的,并且包括在 Python 2.0 的标准 XML 支持里。参考博客:python网络编程学习笔记&am…

linux安装mysql5.5.52,Linux系统上安装MySQL 5.5prm

RapidXML 试用近半年来断断续续的封装一些SDK,在兼顾跨平台.易用性和高效率上还要顾及到对外dll的大小问题.由于之前解析SVG文件的用到了一个XML解析库xercesc,这个DLL实在巨大近4M,于是尝试用新的X ...ios数据库1. ios数据库管理软件 ios使用的数据库是sqlite 管理软件有2种, …

python numpy库安装winerror5_详解idea从git上拉取maven项目详细步骤

刚从Eclipse转Intellij,对于它的各种操作也是一脸懵逼,但觉得使用起来还不错,今天就说一下我用Idea导入git中的Maven项目的详细步骤: 1. 首先打开Intellji Idea,选择check out from Version Control,选择Git(图片上选到gitHub了,抱…

python 函数例子_Python3函数之例子

1.分别使用递归、循环和生成器求菲波那切数列递归:def fib_rec(n):if n 0:return 1if n 1:return 1return fib_rec(n-1) fib_rec(n-2)fib_rec(5)循环:def fib_loop(n):lst []for i in range(n1):if i 0 or i 1:lst.append(1)else:lst.append(lst[-…

java jcsh执行linux命令,java jcsh执行linux命令

java jcsh执行linux命令[2021-02-03 01:26:29] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff…

python目标检测答案_入门指南:用Python实现实时目标检测(内附代码)

全文共6821字,预计学习时长20分钟 来源:Pexels 从自动驾驶汽车检测路上的物体,到通过复杂的面部及身体语言识别发现可能的犯罪活动。多年来,研究人员一直在探索让机器通过视觉识别物体的可能性。 这一特殊领域被称为计算机视觉 (C…

sql md5函数_【学习笔记】常见漏洞:SQL注入的利用与防御

第 21 课 SQL注入的利用与防御课程入口(付费)个人背景李,本科,电子信息工程专业,毕业一年半,有JavaScript的,PHP,Python的语言基础,目前自学网络安全中。SQL注入的利用与防御01 SQL盲注1.1 S…

管理linux的快捷键,Linux快捷键及系统管理命令(1)

快捷键:ctrlU:快速删除光标前所有字符内容。ctrlK:快速删除从当前光标到行尾的所有字符内容。ctrlL:快速清空当前屏幕中显示的内容,只在左上角显示命令提示符。ctrlC:取消当前命令行的编辑,并切…

docker -v 覆盖了容器中的文件_浅谈docker中宿主机和容器之间互相copy文件的两种方式,欢迎补充...

在dokcer的日常使用过程中,我们可能会遇到将宿主机内文件/目录copy到容器内,或者将容器的文件/目录copy到宿主机中,下面我们就来简单的谈一下关于这种情况的两种操作。1、Docker cp命令:用于容器与主机之间的数据copy语法&#xf…

线性代数第九版pdf英文_斯坦福CS229机器学习课程的数学基础(线性代数)翻译完成...

文章转载自公众号 机器学习初学者 , 作者 机器学习初学者Stanford cs229 manchine learning课程,相比于Coursera中的机器学习有更多的数学要求和公式的推导,课程全英文,基础材料部分还没有翻译。这个基础材料主要分为线性代数和概…

用python读取股票价格_Python读取文件并给出股票价格

我使用的是ystockquote,可以找到here。基本上,我有一个包含我所有股票符号的文件,然后我用python将其笔下并显示每只股票的价格。以下是我目前为止的代码:import ystockquote def intro(): # Here you enter the name of your fil…

ppc linux 性能,用profile和oprofile监视视linux性能!

profile使用:profile功能是架构无关的,可以用来监视linux内核的4项功能,即:11 #define CPU_PROFILING 112 #define SCHED_PROFILING 213 #define SLEEP_PROFILING 314 #define KVM_PROFILING 4要想找开profile功能&#xff0c…