python 基礎之物件管理
一、物件的建立
1、__new__方法的作用
__new__方法用於定義建立物件時執行的操作,__new__方法僅僅為使用者提供一個建立物件時干預的入口,真正執行建立物件的操作由object類中的__new__方法完成。
2、__new__方法的定義
定義__new__方法是對 object 類中的方法的重寫,重寫該方法時必須再次呼叫 object 類中的__new__方法.
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(Printer)
return cls.__instance
複製程式碼
3、__ new__ 方法的呼叫
__new__方法在建立物件時自動執行,無需手工執行呼叫該方法。
複製程式碼
二、物件的刪除
1、del操作的作用
del操作的實質是斷開變數與記憶體資料之間的引用,操作del執行後等同於對應變數未進行過定義。
2、del 操作執行的範圍
1.刪除定義的變數:功能等同於變數未定義
2.刪除儲存模型中的資料:將資料按照變數的形式看待,功能等同於未定義過對應的資料
- 列表資料包錯:索引不存在
- 元組物件報錯:元組物件不支援對項的刪除
- 字典物件報錯:鍵錯誤,鍵不存在
3.物件中的屬性:對應物件等同於該物件未定義過該屬性
3、__del__方法作用
__del__方法用於定義物件不存在任何引用時執行的操作。當物件斷開了與最後一個變數之間的引用關係時,將執行該物件的__new__方法。
4、__del__方法執行範圍
1.當手工執行斷開變數與物件的最後一個引用時執行,即del操作
2.當程式執行完畢時,所有變數對應的引用都斷開,此時執行,即退出程式
5、__del__方法呼叫
__del__方法在物件斷開與最後一個變數之間的引用關係時自動執行,無需手工執行呼叫該方法。
三、物件判等
1、物件判等概念
- 當兩個物件對應的引用地址相同時,稱這兩個物件是同一個物件。
2、物件判等語法格式
物件引用地址判等:
物件名 is 物件名 或 變數名 is 變數名
資料引用地址判定:
資料 is 資料
注:判等操作的結果是True或False
複製程式碼
3、 ==與is的區別
- ==操作針對判定的內容不同,規則不同。例如數值性資料比較數值的大小,不考慮是整數還是小數。字串比較字串的內容是否相同,不考慮引用地址是否相同。
- is操作只針對地址進行判定,只要地址相同即返回True,否則返回False
四、單例模式
1、單例模式的作用
控制一個類只能建立出單個例項物件。
2、單例模式書寫規範
class Printer:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(Printer)
return cls.__instance
複製程式碼
3、注意事項
- 1.定義的類變數要進行私有化,否則可以通過類名在類的外部訪問到
- 2.物件的判空操作使用is進行判定
案例:辦公室印表機
"""
案例:辦公室的印表機
一臺印表機可以服務於一個辦公室中所有的人,完成他們的列印任務。
分析:
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()
複製程式碼