当python,单例模式,多例模式,一次初始化遇到一起

Posted lomooo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当python,单例模式,多例模式,一次初始化遇到一起相关的知识,希望对你有一定的参考价值。

1.在python中,单例模式是很容易实现的,随便翻翻网上的相关教程,就能够找到很多答案。

比如这样:

class hello(object):

    def __new__(cls, *args, **kwargs):
        if not ‘_instance_one‘ in vars(cls):
            cls._instance_one=object.__new__(cls)
            return cls._instance_one
        return cls._instance_one

    def __init__(self):
        print self

a=hello()
b=hello()

#************************** result *******************************
<__main__.hello object at 0x7f8afeaf1150>
<__main__.hello object at 0x7f8afeaf1150>

Process finished with exit code 0

可以看到,两个实例的内存地址相同,即表示二者是同一个实例 。

注意:如果我们重写__new__函数的话,需要继承object类。

 

2.需要注意到的是 上例中的self和cls._instance_one实际是同一个东西,我们可以简单做一个测试一下:

class hello(object):
    def __new__(cls, *args, **kwargs):
        if not ‘_instance_one‘ in vars(cls):
            cls._instance_one=object.__new__(cls)
            print cls._instance_one
            return cls._instance_one
        return cls._instance_one

    def __init__(self):
        print self

a=hello()

#************************************** result **********************************

<__main__.hello object at 0x7fb31f65e150>
<__main__.hello object at 0x7fb31f65e150>

Process finished with exit code 0

 

3.如果我们需要让单例模式只初始化一次的话,我们只需要加一个标志即可:

class hello(object):
    def __new__(cls, *args, **kwargs):
        if not ‘_instance_one‘ in vars(cls):
            cls._instance_one=object.__new__(cls)
            cls._instance_one._flag=1
            return cls._instance_one
        return cls._instance_one

    def __init__(self):
        if self._flag:
            print self
            self._flag=0
        print "end"

a=hello()
b=hello()

#************************************result*********************************

<__main__.hello object at 0x7f14de3bd150>
end
end

 

4.注意到上例中的_flag写在类内,类外都可以,我们同样可以做一个实验:

class hello(object):
    _flag=1
    def __new__(cls, *args, **kwargs):
        if not ‘_instance_one‘ in vars(cls):
            cls._instance_one=object.__new__(cls)
            return cls._instance_one
        if not ‘_instance_two‘ in vars(cls):
            cls._instance_two=object.__new__(cls)
            return cls._instance_two

    def __init__(self):
        print self._flag
        self._flag=0
        print self._flag

a=hello()
b=hello()

#*************************************result ***************************************
1
0
1
0

Process finished with exit code 0

 可以看到二者是等价的。

 

以上是关于当python,单例模式,多例模式,一次初始化遇到一起的主要内容,如果未能解决你的问题,请参考以下文章

spring的controller默认是单例还是多例

单例模式和多例模式

单例模式和多例模式的区别(转)

设计模式-单例模式下对多例的思考(案例:Server服务器)

单例模式和多例模式

Spring 单例模式和多例模式