zoukankan      html  css  js  c++  java
  • python实现单例模式

    一、使用__new__方法可以实现单例模式:

    class SingleTon(object):
        def __new__(cls, *args, **kw):
            if not hasattr(cls, 'instance'):
                cls.instance = object.__new__(cls, *args, **kw)
            return cls.instance
    
    class TestClass(SingleTon):
        def __init__(self, num):
            self.num = num
    
    test1 = TestClass(1)
    test2 = TestClass(2)
    print test1.num, test2.num
    print id(test1), id(test2)

    TestClass类实例化时,因为自身的__new__方法没有重写,默认会调用其父类,也就是SingleTon的__new__方法。而SingleTon的__new__方法重写为仅当自身没有instance属性时才会返回一个类实例,从而确保了仅生成1个实例。

    上述代码运行后的结果:

    2 2
    48477016 48477016

    两个实例的id相同,说明是同一个实例。但是其num值为2,是因为第二次实例化test2时,在__init__中将其num覆盖成了2。

    二、使用装饰器实现单例模式:

    from functools import wraps
     
    def SingleTon(cls):
        instances = {}
     
        @wraps(cls)
        def getinstance(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
     
        return getinstance

    这样就能通过@SingleTon来对自定义的类进行装饰,从而实现单例模式。

    @SingleTon
    class TestClass(object):
        def __init__(self, num):
            self.num = num
    
    test1 = TestClass(1)
    test2 = TestClass(2)
    print test1.num, test2.num
    print id(test1), id(test2)

    输出为:

    1 1
    48214760 48214760

    不同于方法一,这里输出的num值为1。

  • 相关阅读:
    os.environ()详解
    查看django setting 源码
    FBV or CBV django settings 源码 模板层语法 摸板的继承 摸板的导入
    jq
    centos安装docker
    idea mapper报红解决
    Method has too many Body parameters
    Gradle安装配置
    itext生成PDF报错java.io.IOException: The document has no pages
    数字千分位
  • 原文地址:https://www.cnblogs.com/00986014w/p/8469925.html
Copyright © 2011-2022 走看看