zoukankan      html  css  js  c++  java
  • 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 '''
  • 相关阅读:
    Out of Hay POJ
    Sum Problem hdu 1001
    N! hdu 1042
    线性表的链式表示和实现(插入删除建空合并)
    NYOJ 1007
    NYOJ 954
    NYOJ 998
    NYOJ 455
    NYOJ 975
    数据结构复习0---线性表
  • 原文地址:https://www.cnblogs.com/aveenzhou/p/2673984.html
Copyright © 2011-2022 走看看