python 基礎之物件管理

python小胡發表於2018-12-15

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()

複製程式碼

相關文章