比方,某个服务器顺序的设置信息存放在一个文件中,客户端经由历程一个 AppConfig 的类来读取设置文件的信息。假如在顺序运转时期,有许多处所都须要运用设置文件的内容,也就是说,许多处所都须要建立 AppConfig 对象的实例,这就致使体系中存在多个 AppConfig 的实例对象,而如许会严峻糟蹋内存资本,尤其是在设置文件内容许多的情况下。事实上,相似 AppConfig 如许的类,我们愿望在顺序运转时期只存在一个实例对象。
单例形式的要点有三个:一是某个类只能有一个实例;二是它必需自行建立这个实例;三是它必需自行向全部体系供应这个实例。
在 Python 中,我们能够用多种方法来完成单例形式:
运用模块
运用 __new__
运用装潢器(decorator)
运用模块
实在,Python 的模块就是天然的单例形式。
由于模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次实行模块代码。因而,我们只需把相干的函数和数据定义在一个模块中,就能够够取得一个单例对象了。
假如我们真的想要一个单例类,能够斟酌如许做:
#tests1.py class MyClass(object): def foo(self): print('MyClass.foo') my_class_obj=MyClass()
将上面的代码保存在文件 tests1.py 中,然后如许运用:
from .tests1 import my_class_obj my_class_obj.foo()
运用 __new__
为了使类只能涌现一个实例,我们能够运用 __new__ 来掌握实例的建立历程,代码以下:
class MyClass(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs) return cls._instance class HerClass(MyClass): a = 1
在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,假如 cls._instance 为 None 则建立实例,不然直接返回 cls._instance。
实行情况以下:
one = HerClass() two = HerClass() print(one == two) #True print(one is two) #True print(id(one), id(two)) #42818864 42818864
运用装潢器
我们晓得,装潢器(decorator)能够动态地修正一个类或函数的功用。这里,我们也能够运用装潢器来装潢某个类,使其只能生成一个实例,代码以下:
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass(object): a = 1
在上面,我们定义了一个装潢器 singleton,它返回了一个内部函数 getinstance,该函数会推断某个类是不是在字典 instances 中,假如不存在,则会将 cls 作为 key,cls(*args, **kw) 作为 value 存到 instances 中,不然,直接返回 instances[cls]。
以上就是python单例形式是什么的细致内容,更多请关注ki4网别的相干文章!