python单例模式

类的初始化和创建:__init__ 、__new__

方法一:

class MyLover:
    __instance = None
    __is_first_init = False

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            MyLover.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self, name):
        if not self.__is_first_init:
            self.__is_first_init = True
            self.name = name
        else:
            print("对不起{},我已经有老婆了{},你不是我老婆".format(name, self.name))

    def show_my_lover(self):
        print("我的老婆是:", self.name + "
")


lover = MyLover("allin")
lover.show_my_lover()

lover1 = MyLover("admin")
lover1.show_my_lover()

方法二:

def singletonDecorator(cls, *args, **kwargs):
    """
    单例装饰器
    :param cls:
    :param args:
    :param kwargs:
    :return:
    """
    instance = {}
    def wrap_singleton(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]

    return wrap_singleton

@singletonDecorator
class MyLover:
    def __init__(self, myLover):
        self._name = myLover

    def get_name(self):
        print("我的老婆是:{}".format(self._name))


m1 = MyLover("allin")
m1.get_name()

m2 = MyLover("admin")
m2.get_name()

instance声明为一个字典,利用它的key的唯一性,这里面的cls其实就是类初始化后的instance的地址,可以id(cls)

人生就是要不断折腾
原文地址:https://www.cnblogs.com/xiangxiaolin/p/12792101.html