zoukankan      html  css  js  c++  java
  • 【Python】单例模式Singleton

    前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现。。。然后就想不起来了。

    之后翻书,原来这些之前都见过的啊。。。。

    1.手动实现真正创建实例的方法__new__()来实现

     1 class Singleton(object):
     2     _instance = None
     3 
     4     def __new__(cls, *args, **kwargs):
     5         if not cls._instance:
     6             cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
     7         return cls._instance
     8 
     9 if __name__ == '__main__':
    10     s1 = Singleton()
    11     s2 = Singleton()
    12     assert id(s1) == id(s2)

    2,利用元类实现:

     1 class Singleton(type):
     2     def __init__(cls, name, bases, dic):
     3         super(Singleton, cls).__init__(name, bases, dic)
     4         cls.instance = None
     5 
     6     def __call__(cls, *args, **kwargs):
     7         if cls.instance is None:
     8             cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
     9         return cls.instance
    10 
    11 
    12 class MySingleton(object):
    13     __metaclass__ = Singleton

    3,利用装饰器实现

     1 def Singleton1(aclass):
     2     instance = None
     3     def oncall(*args):
     4         nonlocal instance
     5         if instance == None
     6             instance = aclass(*args)
     7         return instance
     8     return oncall
     9 
    10 
    11 class singleton2:
    12     def __init__(self, aclass):
    13         self.aclass = aclass
    14         self.instance = None
    15         
    16     def __call__(self, *args):
    17         if self.instance == None:
    18             self.instance = self.aclass(*args)
    19         return self.instance

    4.共享属性

    class Borg(object):
        _state = {}
        def __new__(cls, *args, **kw):
            ob = super(Borg, cls).__new__(cls, *args, **kw)
            ob.__dict__ = cls._state
            return ob
    
    class MyClass2(Borg):
        a = 1

    5.import实现

     1 # mysingleton.py
     2 class My_Singleton(object):
     3     def foo(self):
     4         pass
     5 
     6 my_singleton = My_Singleton()
     7 
     8 # to use
     9 from mysingleton import my_singleton
    10 
    11 my_singleton.foo()

    参考资料:1.改善python程序的91个建议

          2.Python学习手册

                    3.http://python.jobbole.com/85231/

         4.Python Cookbook

  • 相关阅读:
    关于生成并发唯一性流水号的解决方案
    父页面得到<iframe>
    struts2 convention配置中常见配置选项及说明
    Struts2下关于Calendar,date的一些处理
    怎样将用户名和密码保存到Cookie中?【转】
    如何调用用户控件(UserControl)的方法 .
    Struts遍历标签<s:iterator>总结 .
    在事业的开展上保持归零的心态
    这种日子最轻松,这样的人生最快乐
    诚实是人世间最珍贵的宝物,是每个人都应当坚守的伟大情操
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6432300.html
Copyright © 2011-2022 走看看