极速赛车源码出售与python的单例模式

单例模式(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

猜你喜欢

转载自blog.51cto.com/13921197/2159053