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 '''
原文地址:https://www.cnblogs.com/aveenzhou/p/2673984.html