# 本实例主要介绍单例模式
# 1.什么是单例模式
# 1. 确保有且只有一个对象被创建
# 2. 为对象提供一个访问点,以使程序可以全局访问该对象
# 3. 控制共享资源的并行访问 # 2.单例模式实例
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance s = Singleton()
print("Object created",s)
s1 = Singleton()
print("Object created",s1) # 3.单例设计模式中的懒汉式实例化
class Singleton1:
__instance = None
def __init__(self):
if not Singleton1.__instance:
print("__init__ method called")
else:
print("Instance already created", self.getInstance()) @classmethod
def getInstance(cls):
if not cls.__instance:
cls.__instance = Singleton1()
return cls.__instance s = Singleton1()
print("Object created", Singleton1.getInstance())
s1 = Singleton1() # 4.Monostate(Borg) 单态模式
# 所有对象共享相同状态,改变一个实例的状态,另一个实例也会改变
class Borg:
__shared_state = {"1":"2"}
def __init__(self):
self.x = 1
self.__dict__ = self.__shared_state
pass b = Borg()
b1 = Borg()
b.x = 4 print("Borg object b", b)
print("Borg object b1", b1)
print("Object state b", b.__dict__)
print("Object state b1", b1.__dict__) # 基于__new__方法本身实现Borg
class BorgNew:
__shared_state = {}
def __new__(cls, *args, **kwargs):
obj = super(BorgNew , cls).__new__(cls, *args, **kwargs)
obj.__dict__ = cls.__shared_state
return obj b = BorgNew()
b1 = BorgNew()
b.x = 4 print("Borg object b", b)
print("Borg object b1", b1)
print("Object state b", b.__dict__)
print("Object state b1", b1.__dict__) # 5.单例和元类
# 元类: 元类是一个类的类,这意味着该类是它元类的一个实例
class MyInt(type):
def __call__(cls, *args, **kwargs):
print("******Here is MyInt******",args)
print("How do whatever you want with these objects...")
return type.__call__(cls, *args, **kwargs) class int(metaclass=MyInt):
def __init__(self, x, y):
self.x = x
self.y = y i = int(4, 5) # 基于元类的单例实现
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instances[cls] class Logger(metaclass=MetaSingleton):
pass logger1 = Logger()
logger2 = Logger()
print(logger1, logger2) # 6.单例模式的应用
# A. 数据库的操作
import sqlite3
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instances[cls] class Database(metaclass=MetaSingleton):
connection = None
def connect(self):
if self.connection is None:
self.connection = sqlite3.connect('db.sqlite3')
self.cursorobj = self.connection.cursor()
return self.cursorobj db1 = Database().connect()
db2 = Database().connect() print("Database objcursor db1", db1)
print("Database objcursor db2", db2) # 单一的应用可以使用该方法,节约CPU,内存等资源
# 集群化应用, 就需要使用数据库连接池 # B.监控服务
class HealthCheck:
_instances = None
def __new__(cls, *args, **kwargs):
if not HealthCheck._instances:
HealthCheck._instances = super(HealthCheck, cls).__new__(cls, *args, **kwargs)
return HealthCheck._instances def __init__(self):
self._servers = [] def addServer(self):
self._servers.append("server1")
self._servers.append("server2")
self._servers.append("server3")
self._servers.append("server4") def changeServer(self):
self._servers.pop()
self._servers.append("server5") hc1 = HealthCheck()
hc2 = HealthCheck()
print(hc1,hc2) hc1.addServer()
for i in range(4):
print("checking ", hc1._servers[i]) hc2.changeServer()
for i in range(4):
print("checking ", hc2._servers[i]) # 7.单例模式的优缺点
# 优点: 1. 创建有且只有一个对象, 2.节省CPU,内存资源.
# 缺点: 1. 全局变量被误改, 但是别的对象还在引用 2.同一个对象,创建多个引用 3.可能影响其他类

  

单例模式的python实现的更多相关文章

  1. 单例模式以及Python实现

    单例模式以及Python实现 单例模式 单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场.比如,某个服务器的配置信息存在在一个文件中,客户端通过App ...

  2. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  3. 【转】单例模式(python/c++)

    1. 什么是单例模式(Singleton pattern)? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易 ...

  4. 单例模式(python)

    python 的单例模式需要重写__new__()和 __init__() 需要注意,标识符__和_区别 参考资料: https://www.cnblogs.com/huchong/p/8244279 ...

  5. 单例模式【python】

    在python中,如需让一个类只能创建一个实例对象,怎么能才能做到呢? 思路:1.通过同一个类创建的不同对象,都让他们指向同一个方向.   2.让个类只能创建唯一的实例对象. 方法:用到 _ _new ...

  6. python学习(28) 浅谈可变对象的单例模式设计

    python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...

  7. 设计模式(Python)-单例模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  8. python设计模式之单例模式(一)

    前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...

  9. 关于Python中的设计模式

    http://www.oschina.net/question/107361_25331 单例模式:Python 的单例模式最好不要借助类(在 Java 中借助类是因为 Java 所有代码都要写在类中 ...

随机推荐

  1. java 内存模型 ——学习笔记

    一.Java 内存模型 java内存模型把 Java 虚拟机内部划分为线程栈和堆 下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上.      ==>>  一个局部变量可能是 ...

  2. Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.app.Fragment.mNextAnim' on a null object reference

    原因fragment必须先add(),才能remove(),故remove前先做判空操作 参考:http://www.cnblogs.com/hixin/p/4427276.html

  3. 【POJ 2503】 Babelfish

    [题目链接] http://poj.org/problem?id=2503 [算法] 字符串哈希 [代码] #include <algorithm> #include <bitset ...

  4. js的45个技巧

    JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...

  5. codevs1005生日礼物(dfs)

    1005 生日礼物  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 9月12日是小松的朋友小寒的生日.小松知道小寒特别 ...

  6. Java经典算法之冒泡排序(Bubble Sort)

    原理:比较相邻的两个值,将值大的元素交换至右端 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数 ...

  7. 【BZOJ3328】PYXFIB(数学)

    什么都不会的数学蒻菜瑟瑟发抖--Orz橙子(和兔子) 题目: BZOJ3328 分析: 橙子给我安利的数学题--(然后我就看着他因为矩阵乘法多模了一次卡了一天常数qwq表示同情) 先考虑一个子问题:求 ...

  8. flask中路由系统

    flask中的路由我们并不陌生,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 1 ...

  9. S2深入.NET编程总结

    不知从几何时,我也开始变得懒了,以往为了学习的那股子斗劲也早已不在,是时候反思反思了.失败的检测成绩希望可以把我唤醒. 经过总结,在本书中大概学到了这些知识: 1.如果一个类可序列化,则它的子类和包含 ...

  10. drupal-使用hook_preprocess_field在paragraph的accordion中添加自定义数据

    描述:我的accordion类型原先只有两个字段,分别是title和content.显示在页面上会默认隐藏其内容,点击“+”会显示内容.然而现在有一个新需求,就是加一个开关使编辑内容者可以选择默认“展 ...