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()