zoukankan      html  css  js  c++  java
  • Python 单例模式讲解

    Python 单例模式讲解

    本节内容:

    • classmethod用途
    • 单例模式方法一
    • 类__new__方法讲解
    • 单例模式方法二

    前言:

      使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单例模式,第一次实例化创建一个对象,以后在实例化就用第一次创建的对象。

    1. classmethod用途

    普通的类方法:

    def get_no_of_instances(cls_obj):
        return cls_obj.no_inst
    class Kls(object):
        no_inst = 0
        def __init__(self):
            Kls.no_inst = Kls.no_inst + 1
    ik1 = Kls()
    print(ik1.no_inst)
    ik2 = Kls()
    print(ik2.no_inst)
    print(get_no_of_instances(Kls))
    C:Python35python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
    1
    2
    2

     静态方法:

    class Kls(object):
        no_inst = 0
        def __init__(self):
            Kls.no_inst = Kls.no_inst + 1
        @classmethod
        def get_no_of_instance(cls_obj):
            return cls_obj.no_inst
    ik1 = Kls()
    ik2 = Kls()
    print(ik1.get_no_of_instance())
    print(Kls.get_no_of_instance())
    C:Python35python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
    2
    2

     

    2.单例模式方法一

    注意:这种方法需要告诉使用者,必须按照我的方法创建对象,不能直接obj = Foo()

    class Foo():
        _i = None
    
        @classmethod
        def instance(cls):
            if cls._i:
                return cls._i
            else:
                obj = Foo()
                cls._i = obj
                return cls._i
    
    
    #obj = Foo()
    obj = Foo.instance()
    obj1 = Foo.instance()

    3.类的__new__方法讲解

    类实例化时,会先执行类中的new方法,然后在执行init方法。

    class Foo(object):
        def __init__(self):
            self.n = 123
            print('执行顺序2')
        def __new__(cls, *args, **kwargs):
            o = object.__new__(cls, *args, **kwargs)
            print(o,'执行顺序1')
            return o
    
    obj = Foo()
    print(obj,'执行顺序3')
    C:Python35python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
    <__main__.Foo object at 0x001B5BF0> 执行顺序1
    执行顺序2
    <__main__.Foo object at 0x001B5BF0> 执行顺序3

     

    4.单例模式方法二

    这种方法的好处:对于使用者而言,还是正常的实例化,但是后台还是只会创建一个对象。

    class Foo(object):
        _i = None
        def __init__(self):
            self.n = 123
            print('执行顺序2')
        def __new__(cls, *args, **kwargs):
    
            if cls._i:
                return cls._i
            else:
                o = object.__new__(cls, *args, **kwargs)
                cls._i = o
                #print(o,'执行顺序1')
                return cls._i
    
    obj1 = Foo()
    obj2 = Foo()
  • 相关阅读:
    flex4.5 + .net4.0 以二进制方式上传图片
    Flex 使用wigdet组件库 实现自定义事件 派发 和 监听
    flex4.5生成验证码
    转载:区分浏览器关闭和刷新
    访问远程sqlsever 2000服务器设置
    CSS实现三角形
    android SQLite 数据库打开要记得关闭
    在android项目里使用自带的SQLite数据库
    解决使用 JDK 1.7 对 Android apk 签名后程序无法安装的问题
    sina app engine 新浪云计算平台,完备的PHP+MySQL开发平台
  • 原文地址:https://www.cnblogs.com/linux-chenyang/p/7162008.html
Copyright © 2011-2022 走看看