class Singleton: def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super().__new__(cls, *args, **kwargs) return cls._instance class MyClass(Singleton): pass
__new__ 與 __init__ 的聯繫:spa
__new__是在實例建立以前被調用的,由於它的任務就是建立實例而後返回該實例,是個靜態方法。code
__init__是當實例對象建立完成後被調用的,而後設置對象屬性的一些初始值。對象
def singleton(cls): instances = {} def getinstance(*args, **kwargs): if not instances.get(cls): instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass: pass
# myclass.py class MyClass: pass obj = MyClass() # from myclass import obj