目錄python
理解:app
就像a= 1``b=1``c =1
對a、b、c的地址進行打印,都是相同的code
當實例化屢次獲得的對象中存放的屬性都同樣的狀況,應該多個對象指向同一個內存,即同一個實例。對象
模塊settings內存
#settings.py PORT=3306 HOST='127.0.0.1'
要求:get
class Sql(): _instance = None def __init__(self, port, host): self.port = port self.host = host @classmethod def get_sigoleton(cls): import settings if cls._instance: return cls._instance else: cls._instance = cls(settings.PORT, settings.HOST) return cls._instance s1 = Sql.get_sigoleton() s2 = Sql.get_sigoleton() s3 = Sql.get_sigoleton() print(s1) # <__main__.Sql object at 0x000001D7F1BE1188> print(s2) # <__main__.Sql object at 0x000001D7F1BE1188> print(s3) # <__main__.Sql object at 0x000001D7F1BE1188> s4 = Sql('33306', '192.168.1.1') print(s4) # <__main__.Sql object at 0x000001B2AD820348>
要求:it
def get_sigoleton(cls): # cls就是裝飾的時候把Sql傳入 _instance = None def wrapper(*args, **kwargs): if len(args) != 0 or len(kwargs) != 0: # 表示傳入參數生成新對象 res = cls(*args, **kwargs) return res else: import settings nonlocal _instance if not _instance: _instance = cls(settings.PORT, settings.HOST) return _instance return wrapper @get_sigoleton # 會把下面的Sql看成參數傳入,至關於:Sql = get_sigoleton(Sql) class Sql(): def __init__(self, port, host): self.port = port self.host = host s1 = Sql() s2 = Sql() s3 = Sql() print(s1) # <__main__.Sql object at 0x000001E7AED841C8> print(s2) # <__main__.Sql object at 0x000001E7AED841C8> print(s3) # <__main__.Sql object at 0x000001E7AED841C8>
要求:class
class Mymeta(type): def __init__(self, name, bases, dic): import settings # 把實例化好的對象,放到類的名稱空間內 self._instance = self(settings.PORT, settings.HOST) def __call__(self, *args, **kwargs): # self是誰?是Sql類 if len(args) != 0 or len(kwargs) != 0: obj = object.__new__(self) obj.__init__(*args, **kwargs) return obj else: return self._instance class Sql(metaclass=Mymeta): # 至關於Sql = Mymeta(name,bases,dic) # 這個會調用Mymeta的__init__ # 在裏面已經向類的名稱空間放了一個對象 def __init__(self, port, host): self.port = port self.host = host print(Sql.__dict__) s1 = Sql()
要求:test
#sigonleton.py import settings class Sql(): def __init__(self,port,host): self.port = port self.host = host s1 = Sql(settings.PORT,settings.HOST)
def test(): from sigonleton import s1 print(s1.port) print(s1) def teat2(): from sigonleton import s1 as s2 print(s2) test() teat2()