python-物件管理

☞☜123♝發表於2018-12-08

物件管理

__new__方法

  • new()方法用於定義建立物件時執行的操作
  • object類中的__new__()方法完成福相建立過程中的記憶體空間申請,物件屬性初始化等一系列的操作。
#演示
class User:
    def __new__(cls,*args,**kwargs):
    
        print("user new method is running")
        #建立物件由object完成
        instance.obkect.__new__(User)
        return.instance
        
複製程式碼
  • 注意事項
  1. new()方法建立物件時自動執行。
  2. 覆蓋object類中的__new__方法後建立物件將執行覆蓋後的方法
  3. new()方法僅僅是python開放出來給使用者敢於建立物件時的一個操作入口,該方法並不是直接完成分配記憶體、建立物件的操作,建立物件的操作由python底層操作統一管理。

物件的刪除

  • del操作用於從記憶體中刪除對應的變數,並斷開變數與物件間的引用關係
  • 物件操作執行範圍
  1. 刪除定義的變數:功能等同於變數未定義
a = 100
del a
print(a)
#報錯
NameError: name'a' is not defined
複製程式碼
  1. 刪除儲存模型中的資料:將資料按照變數的形式看待,功能等同於未定義過對應的資料
- 列表資料包錯:索引不存在
list1 = [1,2,3]
del list[2]
print(list[2])
# 報錯
IndexError:list index out of range


- 元組物件報錯:元組物件不支援對項的刪除
tupel1 = (1,2,3)
del tuple1[2]
ptint(tuple1[2])

#報錯
TypeError:'tuple' object doesn't support item deletion

- 字典物件報錯:鍵錯誤,鍵不存在
dict1 = {"a":1,"b":2}
del dict1["a"]
print(dict1["a"])

#報錯
KeyError:'a'

- 物件中的屬性:對應物件等同於該物件為定義過該屬性
class User:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
u1 = User("張三",18)
del u1.name
print(u1.name)

#報錯
AttributeError:'User' object has no attribute  'name'
複製程式碼
  • __del__方法作用:
  1. __del__方法用於定義物件不存在任何引用時執行的操作。當物件斷開了與最後一個變數之間的引用關係時,將執行該物件的__new__方法。
  • __del__方法執行範圍
  1. 當手工執行斷開變數與物件的最後一個引用時執行,即del操作。
  2. 當程式執行完畢時,所有變數對應的引用都斷開,此時執行,即退出程式
  • __del__方法呼叫
  1. __del__防範在物件斷開與最後一個變數之間的引用關係時自動執行,無需手工執行呼叫該方法。

物件判等

  • 當兩個物件對應的引用地址相同時,稱這兩個物件時同一個物件。
  • 物件判等語法格式
  • 物件引用地址判等:
物件名 is 物件名    或   變數名 is  變數名
複製程式碼
  • 資料引用地址判定:
資料   is    資料
複製程式碼
  • 注:判等操作的結果是True或False
  • ==與is 的區別
  1. ==操作針對判定的內容不同,規則不同。例如數值型資料比較數值的大小,不考慮是整數還是小數。字串比較字串的內容是否相同,不考慮引用地址是否相同。
  2. is操作只針對地址進行判定,只要地址相同即返回True,否則返回False

單例模式

  • 單例模式的作用
  • 控制一個類智慧創造出單個例項物件
  • 單例模式書寫規範
class 類名:
    __instance = None
    def __new__(cls,*args,**kwargs):
        if cls.__instance is None:
            cls.__instance =object.__new__(類名)
        return cls.__instance
        
複製程式碼
  • 注意事項
  1. 定義的類變數要進行私有化,否則可以通過類名在類的外部訪問到
  2. 物件的判空操作使用is進行判定

相關文章