1. 程式人生 > >單例模式☞Singleton☞讀作:斯英狗疼

單例模式☞Singleton☞讀作:斯英狗疼

☯話不多提,單例的用處大家都知道.☯

上單例



方式一:

✿經典的重寫__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~~

這裡寫圖片描述