说明:python中一个模块就是单例,简单的通过模块就能实现单例。本篇博客介绍两种从根本上实现单例模式
一、重写类方法__new__:
class SingleOne(object):
'''
通过类的__new__实现单例
'''
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
cls._instance = object.__new__(cls)
return cls._instance
single1 = SingleOne()
single2 = SingleOne()
print(single1 is single2)
二、通过元类实现单例
注意:元类中self代表声明该元类的类,类就相当于元类的实例。元类中的self相当于类中的cls
class SingleTwo(type):
'''
元类实现单例,单例的类只需要声明该元类即可
注意:元类中的self不是实例而是声明该元类的类
'''
def __init__(self,*args,**kwargs):
self.__instance = None#为声明该元类的类设置属性,作为实例的引用
print('__init__')
print('self:',self)#元类中的self不是实例而是声明该元类的类
super(SingleTwo, self).__init__(*args,**kwargs)
def __call__(self, *args, **kwargs):
'''
该函数实现该类是否可调用。
在元类中,声明元类的类就是该元类的实例,类名()就会实现调用该函数,借此对象在创建的
之前一定会先调用元类中该函数,因此可以用来判断是否已经存在该实例来实现单例
:param args:
:param kwargs:
:return:
'''
print('__call__')
if self.__instance is None:#判断该类的属性__instance是否为None
self.__instance = super(SingleTwo, self).__call__()#为None创建该类的实例。在元类中__call__返回该类的实例
print('__instance:',self.__instance)
return self.__instance
class A(metaclass=SingleTwo):
pass
class B(metaclass=SingleTwo):
pass
a = A()
a2 = A()
b = B()
b2 = B()
print(a is a2)
print(b is b2)
执行结果:
__init__
self: <class '__main__.A'>
__init__
self: <class '__main__.B'>
__call__
__instance: <__main__.A object at 0x0000019D1796DB70>
__call__
__call__
__instance: <__main__.B object at 0x0000019D1796DCF8>
__call__
True
True