Python实现单例常用的几种方式

本文深入探讨了Python中实现单例模式的多种方法,包括import模式、装饰器版本、共享属性方式以及使用__new__方法,并对比了有无线程安全锁的实现差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.最简单的,日常都在用

import 模式,Python天然的单例模式

# mysingleton.py 中定义
class My_singleton(object):
	a = 1111
	def foo(self):
		pass
my_singleton = My_singleton()

# 在另一个py文件中导入对象my_singleton
from mysingleton import my_singleton

print(my_singleton.a)
>>>>
1111

2.装饰器版本

def singleton(cls,*args,**kwargs):
	instance = {}
	def getinstance():
		if cls not in instance:
			instance[cls] = cls(*args,**kwargs)
		return instance[cls]
	return getinstance

@singleton
class Myclass(object):
	pass

3.共享属性

创建时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法

class Borg(object):
	_state = {}
	def __new__(cls,*args,**kwargs):
		ob = supper(Borg,cls).__new__(cls,*args,**kwargs)
		ob.__dict__ = cls._state
		return ob

class Myclass(Borg):
	pass


4.使用__new__

  • 无线程安全锁
class Singleton(object):
	def __new__(cls,*args,**kwargs):
		if not hasattr(cls,'_instance'):
			orig = super(Singleton,cls)
			cls._instance = orig.__new__(cls,*args,**kwargs)
		return cls._instance

  • 有线程安全锁
import threading
class Singleton(object):
	_instance_lock = threading.Lock()
	def __init__(self):
		pass
	def __new__(cls,*args,**kwargs):
		if not hasattr(Singleton,'_instance'):
			with Singleton._instance_lock:
				if not hasattr(Singleton,'_instance'):
					Singleton._instance = object.__new__(cls)
		return Singleton._instance

模式是一种常用的设计模式,它保证某个类只有一个实存在,并提供一个全局访问点。在 Python 中,模式的实现方式有以下几种: 1. 使用模块:Python 的模块是天然的模式,因为模块在第一次导入时会被缓存,之后的导入会直接使用缓存中的模块对象。因此,我们可以将需要实现模式的类定义在一个模块中,然后在其他模块中导入这个模块即可。 2. 使用 __new__ 方法:Python 中的每个类都有一个特殊的 __new__ 方法,它会在实化对象时被调用。我们可以重写 __new__ 方法,在第一次实化对象时创建一个实,并将其缓存起来,之后的实化直接返回缓存的实即可。 3. 使用装饰器:我们可以编写一个装饰器,将需要实现模式的类装饰起来,使其只能实化一次。具体实现可以利用闭包来保存对象,每次实化时判断是否已经实化过,如果是则直接返回对象。 4. 使用元类:元类是用于创建类的类,我们可以编写一个元类,重写其 __call__ 方法,在创建实时判断是否已经存在实,如果存在则直接返回对象。 对于这些实现方式,还有一些优化技巧可以提升其效率和可用性,如: 1. 线程安全:如果多个线程同时调用对象,可能会导致创建多个实的情况,因此我们需要加锁来保证线程安全。 2. 序列化和反序列化:如果对象需要进行序列化和反序列化操作,我们需要实现 __getstate__ 和 __setstate__ 方法,以便正确地保存和加载对象。 3. 继承和子类化:如果我们需要从类派生子类,可能会破坏模式,因此我们需要重写 __new__ 方法,以便在创建子类对象时也返回对象。 综上所述,模式是一种常用的设计模式,在 Python 中有多种实现方式和优化技巧可供选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值