单例模式

单例模式:是指 一个类的实例从始至终只能被创建一次。

 

1. 模块导入的方式

    导入的模块中有实例化的对象,该对象就是单例模式。仅在模块导入的时候实例化一次,之后就可以使用该对象。

如CRM中v1.py中实例化的site:

site = MySite()   #实例化对象,在此就是 单例模式

 

2. 实例化先执行函数的方式

class Foo:
    _instance = None

    def __init__(self):  # 2 实例化对象
        pass

    @classmethod
    def get_instance(cls):
        if cls._instance:
            return cls._instance  # 4 再次执行函数的时候执行,返回的仍然是obj
        else:
            obj = cls()  # 1 下面执行的时候先执行这里,然后执行__init__
            cls._instance = obj  # 3 对类属性_instance赋值
            return obj


f1 = Foo.get_instance()
f2 = Foo.get_instance()

print(f1)
print(f2)

'''
<__main__.Foo object at 0x0000000001E8FB00>
<__main__.Foo object at 0x0000000001E8FB00>
'''

 

在单例模式中的__init__中传参数并调用参数

class Foo(object):
    _instance = None

    def __init__(self, name):  # 2 实例化对象
        self.name = name  # 传入参数

    @classmethod
    def get_instance(cls, *args, **kwargs):  # 接收参数
        if cls._instance:
            return cls._instance  # 4 再次执行函数的时候执行,返回的仍然是obj
        else:
            obj = cls(*args, **kwargs)  # 1 下面执行的时候先执行这里,然后执行__init__
            cls._instance = obj  # 3 对类属性_instance赋值
            return obj


f1 = Foo.get_instance("asdfasdf")  # 实例化对象
f2 = Foo.get_instance("zds")

print(f1.name)  # 执行对象的方法
print(f2.name)

print(f1)
print(f2)

''' asdfasdf asdfasdf <__main__.Foo object at 0x000000000241FBA8> <__main__.Foo object at 0x000000000241FBA8> '''

 

3. __new__的方式

    上面的方式调用的时候和普通的实例化不一致,通过__new__改造成与普通实例化一致的方式

__new__是创建实例的方法,__init__是类创建实例后调用,所以__new__先执行

#---------- 单例类定义 -------------
 
class Foo(object):
     
    __instance = None
     
    @staticmethod
    def singletion():
        if Foo.__instance:
            return Foo.__instance
        else:
            Foo.__instance = Foo()
            return Foo.__instance
 
 
 
#---------- 获取实例  ---------------
 
obj = Foo.singletion()

 

class Foo:
    _instance = None

    def __init__(self):
        pass

    def __new__(cls, *args, **kwargs):
        if cls._instance:
            return cls._instance
        else:
            # obj = super().__new__(cls,*args,**kwargs)
            obj = object.__new__(cls, *args, **kwargs)  # 所有的类都是object创建的
            cls._instance = obj
            return obj


f1 = Foo()
f2 = Foo()

print(f1)
print(f2)

   

    对于Python单例模式,创建对象时不能直接使用: obj = Foo( ),而应该调用特殊的方法: obj = Foo.singleton( )

 

posted @ 2018-04-28 08:17  shadow3  阅读(100)  评论(0)    收藏  举报