本節內容:python
前言:spa
使用單例方法的好處:對於一個類,屢次實例化會產生多個對象,若使用單例模式,第一次實例化建立一個對象,之後在實例化就用第一次建立的對象。code
普通的類方法:對象
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
靜態方法:blog
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
注意:這種方法須要告訴使用者,必須按照個人方法建立對象,不能直接obj = Foo()get
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()
類實例化時,會先執行類中的new方法,而後在執行init方法。pycharm
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
這種方法的好處:對於使用者而言,仍是正常的實例化,可是後臺仍是隻會建立一個對象。cmd
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()