Python高階編專題 - 類的建立與銷燬
類的建立與銷燬
李俊才
291148484@163.com
如有錯誤請聯絡修正。
【概述】:
本文討論論python物件導向程式設計中的一個重要的話題—— 物件的例項化原理。主要討論了三個魔術方法:
- __new__方法;
- __init__方法;
- __del__方法。
在python中,這三個方法分別涉及類的建立、類的初始化和類的銷燬。下面逐一講解之。
Ⅰ、物件例項化的原理
1.__new__(cls, [...])
方法
功能:建立類的例項。
在python語言中,__new__
方法是第一個執行的方法與實際建立並返回例項的方法(而非__init__
),只不過python已經內建實現了該方法,實際開發中這就足夠了而不需要我們自行定義。一般而言若一個類中定義該方法,需要在實現本類邏輯之前引用父類的實現。
一般,__new__
方法的其它引數將完整地複製到__init__
方法中。因此呼叫類建構函式時,引數首先傳遞給__new__
方法後傳遞給__init__
方法。
class Myclass(object):
def __new__(cls, [...]):
"""建立類的例項
"""
instance = super(Myclass, cls).__new__(cls, [...]) # 類的例項
return instance # 往往希望__new__方法返回類的例項以執行__init__方法
def __init__(self,[...]):
"""初始化類的例項
__init__方法僅在__new__方法返回類的例項的時候被觸發
"""
...
其中位置引數cls
表示建立例項所需要的類,必須在第一個位置且按照慣例命名為cls。
[注意]:
- 只通過
__new__
方法返回當前類的例項時才會被執行,如果返回的不是當前類的例項將不會呼叫__init__
方法。 - 若某些情況下
__new__
方法返回了其它類的例項,__init__
方法也同樣可以被其它類定義的__new__
方法觸發。這將可能導致因執行兩個不同類的__init__
方法而產生問題。
2. __init__(self, [...])
方法
功能:(在類例項建立以後)對類的例項進行初始化性質的定義操作。
在上文中我們已經介紹過,__new__
方法用於建立例項。而一旦__new__
方法建立並返回類的例項後__init__
方法將被觸發執行。實際應用中,__init__
方法用於未建立後的物件提供初始化的資料。請看下例:
class Rectangle(object):
"""矩形類
"""
def __init__(self, x,y,width,height):
"""初始化資料
Parameters
----------
x: int,矩形左下角的橫座標;
y: int,矩形左下角的縱座標;
width: int,矩形的寬;
height: int,矩形的高。
"""
self.x = x
self.y = y
self.width= width
self.height= height
def get_shap(self):
"""獲取矩形當前的位置
"""
return (self.width, self.height)
def get_coordinates (self):
"""返回矩形當前的笛卡爾座標值
"""
return (self.x, self.y)
其中位置引數self
指向當前類的例項,必須在第一個位置且按照慣例命名為self。
在上述的矩形類的__init__
方法中通過傳遞x,y,widyh,height初始化了四個類屬性:
- Rectangle.x
- Rectangle.y
- Rectangle.width
- Rectangle.height
這意味這我們在定義類的例項的時候必須給出x,y,widyh,height四個引數如下:
oneRec = Rectangle(x=0, y=0, width=20, height=100)
Ⅱ、物件的銷燬
3.__del__方法
功能:在物件被銷燬時執行的相關程式碼
雖然果需要銷燬某個物件,可以使用del關鍵字實現。但由於python的記憶體管理機制能夠很好地勝任物件地管理工作,垃圾回收器完成物件銷燬地工作在python中是普遍被接受的,因此不得不說,在python中很少直接銷燬物件。但不論是通過垃圾回收器也好,還是直接使用del關鍵字也好,一旦物件被銷燬在銷燬前都會觸發__del__
方法的執行。
相關文章
- Java高階教程 - 建立和銷燬物件Java物件
- Android執行緒的建立與銷燬Android執行緒
- python例項建立銷燬的函式整理Python函式
- 建立和銷燬物件物件
- 建立和銷燬物件(一)物件
- 詳解.NET依賴注入中物件的建立與“銷燬”依賴注入物件
- 【Java基礎】建立和銷燬物件Java物件
- 關於session的銷燬的問題Session
- 用wxPython建立自銷燬皮膚的方法Python
- Python __del__方法:銷燬物件Python物件
- Python類繼承的高階特性Python繼承
- php的變數引用與銷燬機制PHP變數
- react 學習--元件的生命週期(三)銷燬階段React元件
- Service銷燬流程
- iOS單利的銷燬iOS
- 22_物件的銷燬物件
- OC記憶體管理--物件的生成與銷燬記憶體物件
- C#基礎知識回顧:1.由WeakReference想到物件的建立與銷燬C#物件
- 《effective java》讀書筆記1(建立和銷燬物件)Java筆記物件
- Java高效程式設計之一【建立和銷燬物件】Java程式設計物件
- Python進階:切片的誤區與高階用法Python
- 生命週期就是指物件的建立到銷燬的期間物件
- iOS 建立一個在退出登入時可以銷燬的單例iOS單例
- php完全銷燬sessionPHPSession
- Python函式與模組的精髓與高階特性Python函式
- Python中類的建立與使用例項Python
- 11個提升Python列表編碼效率的高階技巧Python
- Python高階 -- 08 MySQL與Python互動PythonMySql
- 爆炸銷燬動畫元件Explosions動畫元件
- Python進階丨如何建立你的第一個Python元類?Python
- C++基礎回顧5——類的拷貝、複製和銷燬C++
- 驅動開發:核心遠端堆分配與銷燬
- shell高階-----建立函式函式
- Effective Java讀書筆記三:建立和銷燬物件(1-7)Java筆記物件
- DllImport進階:引數配置與高階主題探究Import
- 【學習】高階專題-001-RAC
- Android銷燬執行緒的方式Android執行緒
- 類與物件的建立物件