Python中实现单例模式的几种方法
1 class Singleton(object): 2 def __new__(cls,*args,**kw): 3 if not hasattr(cls,"_instance"): 4 orig=super(Singleton,cls) 5 cls._instance=orig.__new__(cls,*args,**kw) 6 print "Ok" 7 return cls._instance 8 9 class MyClass(Singleton): 10 def __init__(self,name): 11 self.name=name
def singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance @singleton class MyClass: pass
特殊方法__new__是一个元构造程序,每当一个对象必须被factory类实例化时就将调用它
__new__方法必须返回一个类的实例,因此它可以在对象创建之前或之后修改类
因为__init__在子类中不会被隐式调用,所以__new__可以用来确定已经在整个类层次完成了初始化构造
__new__是对于对象状态隐式初始化需求的回应,使得可以在比__init__更低的一个层次上定义一个初始化,
这个初始化总是会被调用
与__init__()相比__new__()方法更像一个真正的构造器。随着类和类型的统一,用户可以对内建类型进行派生,因此需要一种途径来实例化不可变对象,比如派生字符串,在这种情况下解释器则调用类的__new__()方法,一个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来创建对象(向上代理)
__new__必须返回一个合法的实例,这样解释器在调用__init__()时,就可以吧这个实例作为self传给他。调用父类的__new__()来创建对象,正向其他语言使用new关键字一样
另一种方法,通过代表的形式,使用递归的方式建立子类:
1 class OnlyOne: 2 class __OnlyOne: 3 def __init__(self, arg): 4 self.val = arg 5 def __str__(self): 6 return `self` + self.val 7 instance = None 8 def __init__(self, arg): 9 if not OnlyOne.instance: 10 OnlyOne.instance = OnlyOne.__OnlyOne(arg) 11 else: 12 OnlyOne.instance.val = arg 13 def __getattr__(self, name): 14 return getattr(self.instance, name) 15 16 x = OnlyOne('sausage') 17 print x 18 y = OnlyOne('eggs') 19 print y 20 z = OnlyOne('spam') 21 print z 22 print x 23 print y 24 print `x` 25 print `y` 26 print `z` 27 output = ''' 28 <__main__.__OnlyOne instance at 0076B7AC>sausage 29 <__main__.__OnlyOne instance at 0076B7AC>eggs 30 <__main__.__OnlyOne instance at 0076B7AC>spam 31 <__main__.__OnlyOne instance at 0076B7AC>spam 32 <__main__.__OnlyOne instance at 0076B7AC>spam 33 <__main__.OnlyOne instance at 0076C54C> 34 <__main__.OnlyOne instance at 0076DAAC> 35 <__main__.OnlyOne instance at 0076AA3C> 36 '''