Python-实现单例的多种方式(类、函数、自定义)
""" 单例类 方法1:外部函数实现 方法2:外部类数实现 方法3:__new__内置函数实现 __new__函数:在实例化开始时,在调用初始化__init__() 方法之前, 首先调用 __new__() 方法 """ def singleton(cls): """ 修饰类(实现类单例) @param cls: """ instances = {} def inner(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args,**kwargs) return instances[cls] return inner #修饰类(实现类单例) class Singleton(object): def __init__(self, cls): self._cls = cls self._instance = {} def __call__(self): if self._cls not in self._instance: self._instance[self._cls] = self._cls() return self._instance[self._cls] #内置函数(实现类单例) class Singleton1(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_inst'): cls._inst = super(Singleton1, cls).__new__(cls) return cls._inst #内置函数(实现类单例) class Singleton2(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_inst'): cls._inst = object.__new__(cls) return cls._inst #自定义单列 class Person(object): def __new__(cls, name, age): if 0 < age < 100: return object.__new__(cls) else: return None def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f'{self.__class__.__name__}{self.__dict__}' if __name__ == '__main__': s1 = Singleton1() s2 = Singleton1() print(s1) print(s2) p1 = Person('Tom', 10) p2 = Person('Mike', 200) print(p1) print(p2)
""" 单例函数 """ token=None def get_token(): global token if token is None: token='123' return token if __name__ == '__main__': print(get_token()) print(get_token())