__new__方法用於定義建立對象時執行的操做,__new__方法僅僅爲用戶提供一個建立對象時干預的入口,真正執行建立對象的操做由object類中的__new__方法完成。python
定義__new__方法是對 object 類中的方法的重寫,重寫該方法時必須再次調用 object 類中的__new__方法.程序員
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(Printer)
return cls.__instance
複製代碼
__new__方法在建立對象時自動運行,無需手工執行調用該方法。
複製代碼
del操做的實質是斷開變量與內存數據之間的引用,操做del執行後等同於對應變量未進行過定義。app
__del__方法用於定義對象不存在任何引用時執行的操做。當對象斷開了與最後一個變量之間的引用關係時,將執行該對象的__new__方法。spa
1.當手工執行斷開變量與對象的最後一個引用時執行,即del操做code
2.當程序執行完畢時,全部變量對應的引用都斷開,此時執行,即退出程序對象
__del__方法在對象斷開與最後一個變量之間的引用關係時自動執行,無需手工執行調用該方法。索引
對象引用地址判等:
對象名 is 對象名 或 變量名 is 變量名
數據引用地址斷定:
數據 is 數據
注:判等操做的結果是True或False
複製代碼
控制一個類只能建立出單個實例對象。隊列
class Printer:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(Printer)
return cls.__instance
複製代碼
""" 案例:辦公室的打印機 一臺打印機能夠服務於一個辦公室中全部的人,完成他們的打印任務。 分析: 1.打印機:將要打印的任務添加到打印的任務隊列中,真正的打印操做 2.經理:將要打印的操做加入打印機中 3.員工:將要打印的操做加入打印機中 """
class Manager:
def use_printer(self,info,pr):
pr.add_task(info)
class Staff:
def use_printer(self,info,pr):
pr.add_task(info)
class Printer:
"""典型的單例模式"""
__instance = None
def __new__(cls, *args, **kwargs):
"""經過重寫__new__方法來實現只建立一個對象"""
if cls.__instance is None :
cls.__instance = object.__new__(Printer)
return cls.__instance
def __init__(self,list_print = []):
self.list_print = list_print
def add_task(self,info):
"""添加打印信息到打印隊列中"""
self.list_print.append(info)
def print(self):
print(self.list_print)
# 程序員A:
pr1 = Printer() # 建立打印機對象
m1 = Manager() # 建立一個經理對象
m1.use_printer("hello",pr1)
# 程序員B:
pr2 = Printer()
st1 = Staff()
st1.use_printer("itcast",pr2)
# 程序員B1:
pr3 = Printer()
st2 = Staff()
st2.use_printer("itcast666",pr3)
# 程序員C:
pr = Printer()
pr.print()
複製代碼