1. class Singleton(type):
  2. def __init__(self, *args, **kwargs):
  3. self.__instance = None
  4. super().__init__(*args, **kwargs) # 继承type的所有属性
  5. def __call__(self, *args, **kwargs):
  6. if self.__instance is None:
  7. self.__instance = super().__call__(*args, **kwargs) # 调用type的__call__方法 返回值为第一次创建的Spam对象
  8. return self.__instance
  9. else:
  10. return self.__instance
  11. # Example
  12. class Spam(metaclass=Singleton):
  13. def __init__(self):
  14. print('Creating Spam')
  15. """>>> a = Spam()
  16. Creating Spam
  17. >>> b = Spam()
  18. >>> a is b

不用元类的写法

  1. class _Spam:
  2. def __init__(self):
  3. print('Creating Spam')
  4. _spam_instance = None
  5. def Spam():
  6. global _spam_instance
  7. if _spam_instance is not None:
  8. return _spam_instance
  9. else:
  10. _spam_instance = _Spam()
  11. return _spam_instance