示例如下:
# Singleton pattern(i.e., a class where only one instance is ever created)
class Singleton(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super().__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super().__call__(*args, **kwargs)
return self.__instance
else:
return self.__instance
# Example
class Spam(metaclass=Singleton):
def __init__(self):
print('Creating Spam')
a = Spam()
b = Spam()
print(a is b)
c = Spam()
print(a is c)
在创建单例的过程中,有以下几点需要注意:
__init__
方法 来完成。(下图中的self指向class Spam, 并且*args由 类定义的三个部分 构成:类名,继承,属性)
Screen Shot 2019-07-01 at 12.12.08 PM.png
callable
, 执行a=Spam()会触发Singleton的__call__
方法。在执行__call__
中的super().__call__(*args, **kwargs)
语句时,会顺带触发并执行class Spam的__init__
方法。(执行效果如下图所示)
Screen Shot 2019-07-01 at 12.22.50 PM.png