python 工厂模式与单例模式_python基础单例模式 工厂模式 策略模式 观察者模式...

一、单例模式

单例:单个实例,确保某个类只有一个实例存在

举例:1、登录app,当前的登录对象,只能有一个

2、音乐播放器,正在播放的歌曲类而言,只能有一个实例

1 import my_util   # 被导入的模块会从头到尾执行一遍

2

3 o1 = my_util.a

4 o2 = my_util.a

5 o3 = my_util.a

6

7 print(o1)

8 print(o2)

9 print(o3)

10

11

12 class Person:

13     __obj = None  # 单例

14

15     def __new__(cls, *args, **kwargs):  # 创建实例对象 ---> 实例

16

17         if not cls.__obj:

18             cls.__obj = super().__new__(cls)

19         return cls.__obj

20

21     def __init__(self):  # 自己,本身; 谁调用谁就是self; 实际上,在调用init时, 实例对象已经被创建出来了;

22         pass

23

24

25 p1 = Person()  # 1. 调用new方法,创建实例对象, 开辟内存空间, 存储对象   2. 自动调用init方法

26 p2 = Person()

27

28 print(p1)  # <__main__.person object at>

29 print(p2)  # <__main__.person object at>

30

31 # print(Person.__obj)

二、工厂模式

根据不同的条件, 创建不同的实例对象;

汽车父类

兰博基尼子类

法拉利子类

路虎子类

工厂类

方法:传入不同的钱,给你返回不同的汽车对象

商场类

属性:工厂对象

方法:卖小汽车,通过工厂对象卖小汽车

1 class Car:

2     def run(self):

3         print("车行驶")

4

5     def stop(self):

6         print("车制动")

7

8

9 class Lamborghini(Car):

10     def run(self):

11         print("兰博基尼行驶")

12     def stop(self):

13         print("兰博基尼制动")

14

15

16 class Ferrari(Car):

17     def run(self):

18         print("法拉利行驶")

19     def stop(self):

20         print("法拉利制动")

21

22

23 class Land_rover(Car):

24     def run(self):

25         print("路虎行驶")

26     def stop(self):

27         print("路虎制动")

28

29

30 class Factory:

31     def get_money(self, money):

32         if money < 10:

33             return Land_rover()

34         elif money < 100:

35             return Ferrari()

36         else:

37             return Lamborghini()

38

39

40 class SuperMarket:

41     def __init__(self, f_obj):  # 参数: 工厂对象

42         self.f_obj = f_obj

43

44     def sale_car(self, money):

45         return self.f_obj.get_money(money)

46

47

48 f = Factory()

49 # obj = f.get_money(9)

50 # obj.run()

51 # obj.stop()

52

53 s = SuperMarket(f)

54 car = s.sale_car(115)

55 car.run()

56 car.stop()

三、策略模式

达到某个目标,有多种不同的方式,这些方式都有可能会使用到

具体使用哪种方式,根据需求来定

1 # 通知客户搞活动, 发邮件, 发短信;

2

3 # 发送信息的父类

4 class Msg:  # 信息的内容, 联系方式, 发送的方法

5     def __init__(self, info, way):

6         self.info = info

7         self.way = way  # 1336669999 lixiaohua@offcn.com

8

9     def send(self):

10         pass

11

12

13 # 发邮件

14 class Email(Msg):

15     def send(self):

16         return "用邮件的方式, 给{}发送活动信息: {}".format(self.way, self.info)

17

18

19 # 发短信

20 class ShortMsg(Msg):

21     def send(self):

22         return "用短信的方式, 给{}发送活动信息: {}".format(self.way, self.info)

23

24

25 class Customer:

26     def __init__(self, name, tel, email):

27         self.name = name

28         self.tel = tel

29         self.email = email

30         self.receive_way = None  # 接收信息的方式

31

32     def receive_info(self):

33         return self.receive_way.send()

34

35     def set_receive_way(self, obj):  # 设置接收信息的方式  obj可能是邮件对象, 也有可能是短信对象

36         self.receive_way = obj

37

38

39 customer = Customer("xixi", "13333333333", "lixiaohua@offcn.com")

40

41 email = Email("周年庆,买一送一", customer.email)

42 short_msg = ShortMsg("周年庆,买一送一", customer.tel)

43

44 customer.set_receive_way(short_msg)  # 设置接收信息的方式就是短信

45 print(customer.receive_info())

四、观察者模式

小喇叭:一个人说,全校人听

通知中心:校长用喇叭喊

观察者:可以有n多个观察者,一直在监听通知

1 # 通知中心(校长)

2 class Monitor:

3     observer_list = []  # 观察者列表

4     info = ""  # 通知的内容

5     name = ""  # 名字

6

7     def set_observer(self, obj):  # 绑定观察者, 参数:观察者对象

8         Monitor.observer_list.append(obj)

9

10     def show_info(self):  # 发布通知

11         for observer in Monitor.observer_list:  # 遍历获取每一个观察者

12             observer.receive_info()  # 调用观察者的接收信息的方法

13

14

15 # 观察者(学生)

16 class Student:

17

18     def __init__(self, name, monitor):

19         self.name = name

20         self.monitor = monitor  # 通知中心

21

22     def receive_info(self):

23         print("接收方:{}, {}发布了通知, 通知的内容为:{}".format(self.name, self.monitor.name, self.monitor.info))

24

25

26 m = Monitor()

27 Monitor.info = "今天开派对,时间是19:30"

28 Monitor.name = "xixi"

29

30 s1 = Student("haha", m)

31 s2 = Student("hanhan", m)

32

33 m.set_observer(s1)

34 m.set_observer(s2)

35

36 m.show_info()

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

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

相关文章

js sleep函数_简单而面试中又常见的知识点:JS执行机制

在开始讲解之前&#xff0c;我们先来看一段代码&#xff1a;console各位小伙伴觉得上面的结果输出会是多少呢&#xff1f;如果你没有了解过javascript的执行机制的话&#xff0c;上面的题目可能会让你崩溃。不过别着急&#xff0c;先往下看&#xff0c;我保证你看到最后&#x…

护卫神怎么增加php版本_护卫神php套件 php版本升级方法(php5.5.24)

最近小编开始学习研究win2008 r2的php环境配置&#xff0c;发现护卫神的php套件非常好用&#xff0c;安装简单&#xff0c;但是因为php版本不是最新的版本&#xff0c;所以就想将php升级下&#xff0c;因为新版的php修复了一些bug所以这里就分享下方法&#xff0c;需要的朋友可…

servlet中doget和dopost的区别_Servlet学习

一.HTTP协议浏览器 ----------------------------------------->服务器请求 http协议&#xff08;包含&#xff1a;1.请求行2.请求头3.空行4.请求实体&#xff09;url浏览器<-------------------------------------------服务器 响应htmlcssjsdata数据特点&#xff1a; 1…

python numpy dtype object_如何将(dtype = object)numpy数组值设置为Python列表,而不将numpy解释为值列表?...

我有一个dtype object数组,其中的值是Python列表或np.nan.我想用[无](不是无)替换np.nan的值.对于一个纯Python列表,我已经可以使用[x if(x不是np.nan)其他[无] for x in s],并且将数组转换为列表对我来说很好,但是出于好奇,我想知道如何使用numpy数组来完成这项工作.困难在于…

php curl跨域cookie_php使用curl带cookie访问一直失败求助

Launcher:感谢你在百忙中抽空帮我。刚才我做了个对比&#xff1a;1、使用Microsoft Network Monitor 监听apache发送的数据包2、使用Microsoft Network Monitor 截获ie登录目标后台3、使用Microsoft Network Monitor 截获firefox登录目标后台由第一点得到&#xff1a;cookie确实…

python如何用idle启动_Python从IDLE启动的方法

学习Python就要先学会安装和启动&#xff0c;目前Python的启动方法有两种&#xff0c;从IDLE启动是比较常见的&#xff0c;也是小码王老师今天要教大家的&#xff0c;广大家长、小朋友们一起来学习了解一下吧。在Start(开始)菜单中&#xff0c;可以看到“Python2.5”下面的“ID…

java xml 节点路径,SelectSingleNode使用XPath为已知良好的xml节点路径返回null

回答(9)2 years ago我强烈怀疑问题与名称空间有关 . 尝试摆脱名称空间&#xff0c;你会没事的 - 但显然这对你的实际情况没有帮助&#xff0c;我认为这个文件是固定的 .我不记得如何在XPath表达式中指定命名空间&#xff0c;但我确信这是问题所在 .编辑&#xff1a;好的&#x…

php fastcgi exp,nginx +phpfastcgi 环境下 导出excel文件,超时,数据被截断问题,解决...

nginx 错误日志显示&#xff0c;访问超时2015/09/16 07:18:43 [error] 2108#0: *6 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.138.7, server: localhost, request: "GET /test/index.php?mlists.e…

python爬虫软件安装不了_Mac os 下 python爬虫相关的库和软件的安装

由于最近正在放暑假&#xff0c;所以就自己开始学习python中有关爬虫的技术&#xff0c;因为发现其中需要安装许多库与软件所以就在这里记录一下以避免大家在安装时遇到一些不必要的坑。一. 相关软件的安装&#xff1a;1. homebrew:homebrew 是mac os系统下的包管理器由于功能齐…

php中文删除乱码部分,PHP中文乱码解决办法

一&#xff0e; 首先是PHP网页的编码1. php文件本身的编码与网页的编码应匹配a. 如果欲使用gb2312编码&#xff0c;那么php要输出头&#xff1a;header(“Content-Type: text/html; charsetgb2312")&#xff0c;静态页面添加&#xff0c;所有文件的编码格…

hdfs 多租户_【技术干货】常见的HDFS面试问答精选

最常见的HDFS面试问答1. 什么是HDFS&#xff1f;答&#xff1a;HDFS代表Hadoop分布式文件系统&#xff0c;该系统将大型数据集存储在Hadoop中。它可以在商用硬件上运行&#xff0c;并且具有很高的容错能力。HDFS遵循主/从体系结构&#xff0c;其中许多计算机在集群上运行。群集…

python装饰器常见问题_python 装饰器常见用法

跟踪调用class tracer: # State via instance attributesdef __init__(self, func): # On decoratorself.calls 0 # Save func for later callself.func funcdef __call__(self, *args, **kwargs): # On call to original functionself.calls 1print(call %s to %s % (self…

php通过url传递变量,PHP:如何在模态URL中放置和传递变量

所以,我有一个按钮,可以在同一页面中直接链接到模态.这是按钮和网址href"main_user.php?user_id<?php echo $user[user_id]; ?>#myModal"class"btn btn-warning">(我尝试在#modal之前回显$user_id)是不是&#xff1f;单击按钮后,将出现模态.这…

python 根据类名 查找module_关于 Python 命令中的 m 参数

在命令行中使用 Python 时&#xff0c;它可以接收大约 20 个选项(option)&#xff0c;语法格式如下&#xff1a;python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]本文想要聊聊比较特殊的“-m”选项&#xff1a;关于它的典型用法、原理解析与发…

php xampp bug,PHP网站访问慢的处理方法

如果网站跑在了LAMP环境中&#xff0c;就无法使用php-fpm的slow log了&#xff0c;那如何分析瓶颈点&#xff1f;没关系你还可以使用这个XdebugWebgrind&#xff0c;其中Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具)&#xff0c;可以用来跟踪&#xff0c;调试和分析…

matlab安装程序无法启动jvm_JVM 执行 Java 程序时的内存区域划分

在学习 Java 虚拟机(后面简称&#xff1a; JVM )中的垃圾回收机制(GC)之前&#xff0c;先需要了解 在 JVM 中的 Java 程序(class 文件)加载到内存之后到底是怎么存的。在阅读了 JVM规范 和周志明的 《深入理解Java虚拟机(第2版)》 之后&#xff0c;总结一下JVM中的内存划分以及…

phpFpm加载php,php-fpm添加service服务的例子

nginx通过FastCGI运行PHP比Apache包含PHP环境有明显的优势,最近有消息称,PHP5.4将很有可能把PHP-FPM补丁包含在内核里,nginx服务器平台上运行PHP将更加轻松,下面我们就来看一篇php-fpm平滑启动并配置服务例子。我的php是源码安装的。php-fpm在PHP 5.3.2以后的版本不支持以前的p…

python 性能问题_Python 性能问题一直饱受诟病,这篇我们讨论下提升 Python 应用性能的常见方法。...

Python - 提高Python运行效率的六个窍门Python是一门优秀的语言&#xff0c;它能让你在短时间内通过极少量代码就能完成许多操作。不仅如此&#xff0c;它还轻松支持多任务处理&#xff0c;比如多进程。不喜欢Python的人经常会吐嘈Python运行太慢。但是&#xff0c;事实并非如此…

php中没有dockerfile,Dockerfile在RUN composer install命令中没有使用缓...

我以为我已经理解了Docker,但今天我发现了一些关于利用docker缓存的问题.这是我的dockerfileFROM quay.io/my_company/phpjenkinsWORKDIR /usr/src/my_projectADD composer.json composer.jsonADD composer.lock composer.lockRUN composer install -oADD . .RUN mkdir -p temp…

map循环遍历取值_Collection集合框架集和map

Collection集合框架集Java培训之Collection集合框架集MapMap概述Map与Collection并列存在。用于保存具有映射关系的数据:Key-ValueMap 中的 key 和 value 都可以是任何引用类型的数据Map 中的 key 不允许重复key 和 value 之间存在单向一对一关系&#xff0c;即通过指定的 key …