Python高階編專題 - 類的建立與銷燬

李俊才發表於2020-12-22

類的建立與銷燬

李俊才
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__方法的執行。

相關文章