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:\Python35\python3.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:\Python35\python3.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:\Python35\python3.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()

 

posted @ 2017-07-13 18:21  一只奔跑的乌龟  阅读(1120)  评论(0编辑  收藏  举报