單例模式☞Singleton☞讀作:斯英狗疼
阿新 • • 發佈:2018-11-14
☯話不多提,單例的用處大家都知道.☯
上單例
方式一:
✿經典的重寫__new__
方法實現單例✿
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
方式二:
✿使用元類type
class Singleton(type):
def __init__(cls, *args, **kwargs):
cls.__instance = None
super(Singleton, cls).__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.__instance
class UseClass(metaclass=Singleton): # metaclass= 為 python3的寫法
# __metaclass__ = Singleton # __metaclass__ 為 python2的寫法
pass
方式三:
✿裝飾器
方式實現單例✿
def singleton(cls, *args, **kwargs):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
@singleton
class UseClass(object):
pass
✿附: 以上三種的校驗.✿
if __name__ == '__main__':
s1 = UseClass()
s2 = UseClass()
print(id(s1)) # 140365945542080
print(id(s2)) # 140365945542080
print(s1 == s2) # True
print(s1 is s2) # True
方式四:
✿匯入
建立好的物件✿
# a.py
class UseClass(object): # 在a.py中建立好要成為單例的物件.
pass
uc = UseClass()
# b.py
from a import uc # 匯入已經a中已經建立好的物件
print(id(uc))
# c.py
from a import uc # 匯入已經a中已經建立好的物件
print(id(uc))
(這個看看玩就行啦.)
擴充套件實現???what??黑人問號???:
✿兩個物件使用同一個__dict__
(目前沒發現有什麼特別的用處…)✿
class Singleton(object):
_state = {}
def __new__(cls, *args, **kwargs):
obj = super(Singleton, cls).__new__(cls, *args, **kwargs)
obj.__dict__ = obj._state
return obj
class UseClass(Singleton):
pass
uc1 = UseClass()
uc2 = UseClass()
print(id(uc1)) # 140520618571536
print(id(uc2)) # 140520618595384
print(id(uc1) == id(uc2)) # False
print(uc1.__dict__) # {}
print(uc2.__dict__) # {}
print(id(uc1.__dict__) == id(uc2.__dict__)) # True
!!!版權宣告!!!
本系列為博主學心得與體會,所有內容均為原創(✿◡‿◡)
歡迎傳播、複製、修改。引用、轉載等請註明轉載來源。感謝您的配合
用於商業目的,請與博主採取聯絡,並請與原書版權所有者聯絡,謝謝!\(≧▽≦)/
我的聯絡方式:email–> [email protected]
!!!版權宣告!!!
生活嘛~ 最重要的就是開心嘍~ O(∩_∩)O~~