单例模式就是对象只实例化一次,再次实例化还是原来实例化的。单例模式的创建一共有三种方式:
模块导入的方式
导入的模块中有实例化的对象,该对象就是单例模式。仅在模块导入的时候实例化一次,之后就可以使用该对象。
如CRM中v1.py中实例化的site。site = CurdSite() # 实例化对象,就是self 这里就是单例模式
实例化先执行函数的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Foo: _instance = None def __init__(self): pass @classmethod def get_instance(cls): if cls._instance: return cls._instance else: obj = cls() cls._instance = obj return obj f1 = Foo.get_instance() f2 = Foo.get_instance() print(f1) print(f2)
|
结果:
1 2
| __main__.Foo object at 0x0000000002ACB5F8 __main__.Foo object at 0x0000000002ACB5F8
|
在单例模式中的init中传参数并调用参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Foo: _instance = None def __init__(self,name): self.name = name @classmethod def get_instance(cls,*args,**kwargs): if cls._instance: return cls._instance else: obj = cls(*args,**kwargs) cls._instance = obj return obj f1 = Foo.get_instance("asdfasdf") f2 = Foo.get_instance("zds") print(f1.name) print(f2.name)
|
最终结果得到的是一样的内容:
1 2 3 4
| asdfasdf asdfasdf <__main__.Foo object at 0x000000000280B7B8> <__main__.Foo object at 0x000000000280B7B8>
|
__new__ 的方式
上面的方式调用的时候和普通的实例化不一致,通过new改造成与普通实例化一致的方式
new是创建实例的方法,init是类创建实例后调用,所以new先执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Foo: _instance = None def __init__(self): pass def __new__(cls, *args, **kwargs): if cls._instance: return cls._instance else: obj = object.__new__(cls, *args, **kwargs) cls._instance = obj return obj f1 = Foo() f2 = Foo() print(f1) print(f2)
|