Cinco implementaciones del modo singleton de Python

__new__Implementación de métodos especiales

class Singleton:

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, name):
        self.name = name

s1 = Singleton('first')
s2= Singleton('last')
print(s1 == s2)
>> True
print(s1.name)
>> last

consejos: el new__método no puede evitar activarse __init(), las variables miembro iniciales se sobrescribirán

Implementación del decorador

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''

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

@singleton
class Test:
    def __init__(self, name):
        self.name = name

t1 = Test('first')
t2 = Test('last')
print(t1==t2)
>> True
print(t2.name)
>> first

Implementación del decorador de clases

class Singleton:
    def __init__(self, cls):
        self._cls = cls
        self._instance = {
    
    }

    def __call__(self, *args):
        if self._cls not in self._instance:
            self._instance[self._cls] = self._cls(*args)
        return self._instance[self._cls]

@Singleton
class Cls2:
    def __init__(self, name):
        self.name = name

cls1 = Cls2('first')
cls2 = Cls2('last')
print(id(cls1) == id(cls2))
>> True
print(cls1.name)
>> first

Implementación de metaclase

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Singleton1(type):
    def __init__(self, *args, **kwargs):
        self.__instance = None
        super(Singleton1, self).__init__(*args, **kwargs)

    def __call__(self, *args, **kwargs):
        if self.__instance is None:
            self.__instance = super(Singleton1, self).__call__(*args, **kwargs)
        return self.__instance

class C(metaclass=Singleton1):
    def __init__(self, name):
        self.name = name

c1 = C('first')
c2 = C('last')
print(c1 == c2)
>> True
print(c2.name)
>> first

Implementación del módulo

El módulo Python es un modo singleton natural, porque el módulo generará un archivo .pyc cuando se importe por primera vez. Cuando se importe por segunda vez, el archivo .pyc se cargará directamente sin ejecutar el código del módulo nuevamente. .

#foo1.py
class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

#foo.py
from foo1 import singleton

Supongo que te gusta

Origin blog.csdn.net/qdPython/article/details/112988239
Recomendado
Clasificación