优点: 对唯一实例的受控访问,节省资源;单例相当于全局变量,防止了命名空间被污染。
__new__实现:
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
class MyClass(Singleton):
pass
a = MyClass(10)
b = MyClass(20)
print(id(a), id(b)) # 140438916573112 140438916573112
装饰器实现:
def warpper(classObject):
def inner(*args, **kwargs):
if not hasattr(classObject, '_instance'):
classObject._instance = classObject(*args, **kwargs)
return classObject._instance
return inner
@warpper
class MyClass3(object):
pass
c = MyClass3()
d = MyClass3()
print(id(c), id(d)) # 140438916862976 140438916862976