在python中怎么实现单例模式
发表于:2024-11-27 作者:热门IT资讯网编辑
编辑最后更新 2024年11月27日,在python中怎么实现单例模式?下面给大家带来七种不同的方法:一:staticmethod代码如下:class Singleton(object): instance = None de
在python中怎么实现单例模式?下面给大家带来七种不同的方法:
一:staticmethod
代码如下:
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instancea = Singleton.get_instance()b = Singleton.get_instance()print('a id=', id(a))print('b id=', id(b))
该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。
二:classmethod
和方法一类似,代码:
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(cls): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instancea = Singleton.get_instance()b = Singleton.get_instance()print('a id=', id(a))print('b id=', id(b))
该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。
三:类属性方法
和方法一类似, 代码:
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instancea = Singleton.get_instance()b = Singleton.get_instance()print(id(a))print(id(b))
该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。
四:__new__
常见的方法, 代码如下:
class Singleton(object): instance = None def __new__(cls, *args, **kw): if not cls.instance: # cls.instance = object.__new__(cls, *args) cls.instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls.instancea = Singleton()b = Singleton()print(id(a))print(id(b))
五:装饰器
代码如下:
def Singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstanceclass MyClass: passa = MyClass()b = MyClass()c = MyClass()print(id(a))print(id(b))print(id(c))
六:元类
python2版:
class Singleton(type): def __init__(cls, name, bases, dct): super(Singleton, cls).__init__(name, bases, dct) cls.instance = None def __call__(cls, *args): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args) return cls.instanceclass MyClass(object): __metaclass__ = Singletona = MyClass()b = MyClass()c = MyClass()print(id(a))print(id(b))print(id(c))print(a is b)print(a is c)
或者:
class Singleton(type): def __new__(cls, name, bases, attrs): attrs["_instance"] = None return super(Singleton, cls).__new__(cls, name, bases, attrs) def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instanceclass Foo(object): __metaclass__ = Singletonx = Foo()y = Foo()print(id(x))print(id(y))
python3版:
class Singleton(type): def __new__(cls, name, bases, attrs): attrs['instance'] = None return super(Singleton, cls).__new__(cls, name, bases, attrs) def __call__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args, **kwargs) return cls.instanceclass Foo(metaclass=Singleton): passx = Foo()y = Foo()print(id(x))print(id(y))
七:名字覆盖
代码如下:
class Singleton(object): def foo(self): print('foo') def __call__(self): return selfSingleton = Singleton()Singleton.foo()a = Singleton()b = Singleton()print(id(a))print(id(b))
以上就是在python中怎么实现单例模式的详细内容,更多请关注其它相关文章!