单例模式(Singleton Pattern)主要是确保某一个类只有一个实例存在,如果希望整个系统中只出现一个实例时,就可以使用单例对象 极速赛车源码出售企俄:2152876294 网址diguaym.com
在 Python 中,我们可以用多种方法来实现单例模式:
使用模块
使用 new
使用装饰器(decorator)
使用元类(metaclass)
使用模块
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
未使用单例模式
class my_singleton(object):
def say(self):
print("this is a singleton pattern")
a =my_singleton()
b =my_singleton()
print(id(a),id(b))
1
2
3
4
5
6
7
==>
2326253591352 2326253591296
1
下面使用单例模式(模块法)
#demo8.py
class my_singleton(object):
def say(self):
print("this is a singleton pattern")
#先生成一个实例
singleton = my_singleton()
1
2
3
4
5
6
导入模块
from demo8 import singleton
a = singleton
b=singleton
print(id(a),id(b))
print(a==b)
print(a is b)
1
2
3
4
5
6
== 是值相等,is是地址相等
==>
2166326541016 2166326541016
True
True
1
2
3
使用new方法
将实例跟一个类变量关联起来,如果该类变量为none则创建实例,否则返回实例
class Singleton(object):
_instance=None
def new(cls, *args, *kwargs):
if not cls._instance: cls._instance=super(Singleton,cls).new(cls,args,**kwargs)
return cls._instance
class Myclass(Singleton):
name="wdp"
a= Myclass()
b= Myclass()
print(id(a),id(b))
1
2
3
4
5
6
7
8
9
10
11
12
==>
1691584036632 1691584036632
1
使用装饰器
使用装饰器来装饰某个类,使其只能生产一个实例
from functools import wraps
def singleton(cls):
instances = {}br/>@wraps(cls)
def getinstance(*args, *kw):
if cls not in instances:
instances[cls] = cls(args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass(object):
a = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用元类(metaclass)
元类(metaclass)可以控制类的创建过程,它主要做三件事:
拦截类的创建
修改类的定义
返回修改后的类
class Singleton(type):
_instances = {}
def call(cls, *args, *kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).call(args, **kwargs)
return cls._instances[cls]
Python3
class MyClass(metaclass=Singleton):
pass
1
2
3
4
5
6
7
8
9
10
11