单例模式:是指 一个类的实例从始至终只能被创建一次。
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 0x02EF55F0> # <__main__.Foo object at 0x02EF55F0>
在单例模式中的__init__中传参数并调用参数
class Foo: _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 0x03364490> # <__main__.Foo object at 0x03364490>
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( )