博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式的python实现
阅读量:4494 次
发布时间:2019-06-08

本文共 3568 字,大约阅读时间需要 11 分钟。

# 本实例主要介绍单例模式# 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.instances = 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.__instances = 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		passb = Borg()b1 = Borg()b.x = 4print("Borg object b", b)print("Borg object b1", b1)print("Object state b", b.__dict__)print("Object state b1", b1.__dict__)# 基于__new__方法本身实现Borgclass BorgNew:	__shared_state = {}	def __new__(cls, *args, **kwargs):		obj = super(BorgNew , cls).__new__(cls, *args, **kwargs)		obj.__dict__ = cls.__shared_state		return objb = BorgNew()b1 = BorgNew()b.x = 4print("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 = yi = 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):	passlogger1 = Logger()logger2 = Logger()print(logger1, logger2)	# 6.单例模式的应用		# A. 数据库的操作import sqlite3class 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.cursorobjdb1 = 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.可能影响其他类

  

转载于:https://www.cnblogs.com/fireblackman/p/10543757.html

你可能感兴趣的文章
谁分配谁释放
查看>>
正则表达式
查看>>
Java集合之LinkedHashSet源码分析
查看>>
David Silver强化学习Lecture1:强化学习简介
查看>>
开源项目
查看>>
mvc4 找到多个与名为“xx”的控制器匹配的类型
查看>>
unix系统内核优点
查看>>
协议(五)-从电报机到智能手机
查看>>
Solr学习
查看>>
HDU-4628 Pieces 搜索 | DP
查看>>
动态代理
查看>>
C++ 错误积累
查看>>
java基础基础总结----- 构造方法,可变参数列表
查看>>
蓝瘦香菇
查看>>
纸上谈兵:栈(stack)
查看>>
多线程同步与通信
查看>>
java 注解类说明
查看>>
9.8考试
查看>>
潜移默化学会WPF--ProcessBar学习(一)
查看>>
Theory and Simulation in Neuroscience
查看>>