class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
print('is here')
return cls._instance
def __init__(self):
print('init is start!')
s = Singleton()
#输出结果在这里
is here
init is start!
以上简单的实现了一个单例。
__new__先于__init__被调用,而__new__必须要有返回值,返回的就是__init__的第一个参数self。
简单来说,__new__方法实现在__init__之前,__init__是对已经被创建出的实例进行初始化添加一些属性或者参数,而__new__方法是在创建实例过程中进行一些操作。
#注意,__new__一定要在新式类中使用,python3默认新式类,python2的话要在类后面继承object。