设计模式

一、单例模式

单例,顾名思义单个实例。创建一个实例

链接池案例

1、单例=》只有一个实例

2、静态方法+静态字段

3、所有的实例中封装的内容相同时用单例模式

class ConnectionPoll:
__instance = None #静态字段只有类可以访问 def __init__(self):
self.ip = "1.1.1.1"
self.port = 3306
self.pwd = 123
self.username = "root" self.conn_list = [1,2,3,4,5,6,7] @staticmethod
def get_instance():
if ConnectionPoll.__instance:
return ConnectionPoll.__instance
else:
#创建一个对象,并且赋值给__instance
ConnectionPoll.__instance = ConnectionPoll()
return ConnectionPoll.__instance
#静态方法类去访问
obj1 = ConnectionPoll.get_instance()
print(obj1)
obj2 = ConnectionPoll.get_instance()
print(obj2)
obj2= ConnectionPoll.get_instance()
print(obj2) ---------------------------
<__main__.ConnectionPoll object at 0x000002FEC59D42E8>
<__main__.ConnectionPoll object at 0x000002FEC59D42E8>
<__main__.ConnectionPoll object at 0x000002FEC59D42E8>

学习单例之前,首先来回顾下面向对象的内容:

python的面向对象由两个非常重要的两个“东西”组成:类、实例

面向对象场景一:

如:创建三个游戏人物,分别是:

  • 苍井井,女,18,初始战斗力1000
  • 东尼木木,男,20,初始战斗力1800
  • 波多多,女,19,初始战斗力2500
# #####################  定义类  #####################
class Person: def __init__(self, na, gen, age, fig):
self.name = na
self.gender = gen
self.age = age
self.fight =fig def grassland(self):
"""注释:草丛战斗,消耗200战斗力""" self.fight = self.fight - 200 # ##################### 创建实例 ##################### cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
bo = Person('波多多', '女', 19, 2500) # 创建波多多角色 创建实例

面向对象场景二:

如:创建对数据库操作的公共类

# #### 定义类 ####

class DbHelper(object):

    def __init__(self):
self.hostname = '1.1.1.1'
self.port = 3306
self.password = 'pwd'
self.username = 'root' def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def create(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
pass # #### 操作类 #### db = DbHelper()
db.create() 创建示例

实例:结合场景二实现Web应用程序

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server class DbHelper(object): def __init__(self):
self.hostname = '1.1.1.1'
self.port = 3306
self.password = 'pwd'
self.username = 'root' def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'fetch' def create(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'create' def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'remove' def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'modify' class Handler(object): def index(self):
# 创建对象
db = DbHelper()
db.fetch()
return 'index' def news(self):
return 'news' def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
ret = func()
return ret
else:
return '404 not found' if __name__ == '__main__':
httpd = make_server('', 8001, RunServer)
print "Serving HTTP on port 8001..."
httpd.serve_forever() Web应用程序实例 测试代码

对于上述实例,每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法。

那么问题来了...如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用,也是极好的!!!

单例模式出马,单例模式用来保证内存中仅存在一个实例!!!

通过面向对象的特性,构造出单例模式:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_ class ConnectionPoll:
__instance = None def __init__(self):
self.ip = "1.1.1.1"
self.port = 3306
self.pwd = 123
self.username = "root" self.conn_list = [1,2,3,4,5,6,7] @staticmethod
def get_instance():
if ConnectionPoll.__instance:
return ConnectionPoll.__instance
else:
ConnectionPoll.__instance = ConnectionPoll()
return ConnectionPoll.__instance obj1 = ConnectionPoll.get_instance()
print(obj1)
obj2 = ConnectionPoll.get_instance()
print(obj2)
obj2= ConnectionPoll.get_instance()
print(obj2) 通过面向对象的特性,构造出单例模式:
# ########### 单例类定义 ###########
class Foo(object): __instance = None @staticmethod
def singleton():
if Foo.__instance:
return Foo.__instance
else:
Foo.__instance = Foo()
return Foo.__instance # ########### 获取实例 ###########
obj = Foo.singleton()

 对于Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton() 。

这样多个人链接服务器访问地址就会只在内存中拿一份了

 #!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server # ########### 单例类定义 ###########
class DbHelper(object): __instance = None def __init__(self):
self.hostname = '1.1.1.1'
self.port = 3306
self.password = 'pwd'
self.username = 'root' @staticmethod
def singleton():
if DbHelper.__instance:
return DbHelper.__instance
else:
DbHelper.__instance = DbHelper()
return DbHelper.__instance def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def create(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
pass class Handler(object): def index(self):
obj = DbHelper.singleton()
print id(single)
obj.create()
return 'index' def news(self):
return 'news' def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
ret = func()
return ret
else:
return '404 not found' if __name__ == '__main__':
httpd = make_server('', 8001, RunServer)
print "Serving HTTP on port 8001..."
httpd.serve_forever() Web应用实例-单例模式

web实例-单例模式

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server class ConnectionPool: __instance = None def __init__(self):
self.ip = "1.1.1.1"
self.port = 3306
self.pwd = ""
self.username = 'xxxx'
# 去连接
self.conn_list = [1,2,3,4,5,6,7,8,9, 10] @staticmethod
def get_instance():
if ConnectionPool.__instance:
return ConnectionPool.__instance
else:
# 创建一个对象,并将对象赋值给静态字段 __instance
ConnectionPool.__instance = ConnectionPool()
return ConnectionPool.__instance def get_connection(self):
# 获取连接
import random
r = random.randrange(1,11)
return r def index():
# p = ConnectionPool()
# print(p)
p = ConnectionPool.get_instance()
conn = p.get_connection()
return "fuck u bitch " + str(conn) def news():
return 'bitchbitchbitchbitch' def RunServer(environ, start_response):
start_response(status='200 OK', headers=[('Content-Type', 'text/html')]) url = environ['PATH_INFO']
if url.endswith('index'):
ret = index()
return ret
elif url.endswith('news'):
ret = news()
return ret
else:
return "" if __name__ == '__main__':
httpd = make_server('', 8077, RunServer)
print("Serving HTTP on port 8008...")
httpd.serve_forever() Web应用实例-单例模式

web实例-单例模式

总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!

python基础-9.2 单例模式的更多相关文章

  1. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...

  2. 面试题-python基础

    一.Python基础 1.什么是python?使用python有什么好处? python是一种编程语言,它有对象.模块.线程.异常处理和自动内存管理.它简洁,简单.方便.容易扩展.有许多自带的数据结果 ...

  3. 一、python基础相关知识体系

    python基础 a. Python(解释型语言.弱类型语言)和其他语言的区别? 一.编译型语言:一次性,将全部的程序编译成二进制文件,然后在运行.(c,c++ ,go) 运行速度快.开发效率低 二. ...

  4. python基础知识的学习和理解

    参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base   python基础知识笔 ...

  5. python基础面试题(全网最全!)

    目录 1.为什么学习Python? 2.通过什么途径学习的Python? 3.Python和Java.PHP.C.C#.C++等其他语言的对比? 4.简述解释型和编译型编程语言? 5.Python解释 ...

  6. python基础全部知识点整理,超级全(20万字+)

    目录 Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https:// ...

  7. python之最强王者(2)——python基础语法

    背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...

  8. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

  9. Python小白的发展之路之Python基础(一)

    Python基础部分1: 1.Python简介 2.Python 2 or 3,两者的主要区别 3.Python解释器 4.安装Python 5.第一个Python程序 Hello World 6.P ...

随机推荐

  1. 《Java核心技术卷I》——第3章 Java的基本程序设计结构

    byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组. 十六进制数值有一个前缀0x(如0xCAFE),八进制有一个前缀0,如010对应八进制中的8.很 ...

  2. CentOS7编译安装MySQL8.0

    1.下载mysql8.0.16源码包和cmake源码包 cd /usr/local/srcwget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-b ...

  3. VB中preserve的用法

    注:本文转载自:http://zhidao.baidu.com/question/161401549.html ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private. ...

  4. HDU 5988 Coding Contest 最小费用流 cost->double

    Problem Description A coding contest will be held in this university, in a huge playground. The whol ...

  5. 你真的懂git rebase吗?

    前段时间由于某种原因,开始接手开发公司前端Vue搭建的项目 该前端项目采用的是基于git rebase的形式去合并代码,而我之前使用git一直都是采用merge的形式合并分支代码,对于rebase一概 ...

  6. bzoj5090 [Lydsy1711月赛]组题 分数规划

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5090 题解 令 \(s_i\) 表示 \(a_i\) 的前缀和. 那么平均难度系数就是 \[ ...

  7. HTML加载过程

    在地址栏输入url,返回html后,浏览器开始顺序加载并渲染DOM Body标签 当浏览器遇到body标签才算真正开始加载并渲染DOM,此时会有以下几种情况: DOM元素 浏览器遇到dom元素时,正常 ...

  8. 如何解决MSVCR120.dll在Windows上缺少错误?

    在安装MySQL的时候,执行mysqld的时候,提示msvcr120.dll,是因为计算机中丢失了 一些文件 然后点击我下载完成安装就好了, 备注:两个都得安装!

  9. 51nod1820 长城之旅

    题目描述 BB 痛失一血(打了场Comet OJ回来就没了) 不过后来又刷了一道水题 题解 LCM+取模=结论题 结论1 \(gcd(k^{2^i}+1,k^{2^j}+1)=1 (i\neq j 且 ...

  10. linux运维、架构之路-jumpserver

    一.jumpserver介绍           是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 特点: 完全开源,GPL ...