自學Python:python中的魔法方法

魔法方法

1、python中的魔法方法總是被雙下劃線__包圍,比如:__init__();
2、魔法方法的魔法就體現在他們會在需要的時候被自動調用。

構造函數與析構函數

構造函數

1、用於初始化類的內部狀態,python提供的類構造函數__init__()與__new__();
2、__init__():__init__()方法是可選的,如果沒有定義,則使用默認的__init__()方法;
3、__new__():__new__()方法也是可選的,而且平時也很少去重寫他,只有當繼承一個不可變類型的時候,纔會對其進行重寫。

析構函數

1、用於回收對象的資源,python提供的析構函數__del__();
2、__del__()函數也是可選的,如果沒有定義,python會在後臺提供默認的析構函數;
3、如果要顯式的調用析構函數,可以使用del關鍵字。

__init__()

構造函數,用於初始化類內部的狀態,初始化實例對象,返回值只能爲None

>>> class Rectangle:
	"""
	定義一個矩形類,
	需要長和寬兩個參數,
	擁有計算周長和麪積兩個方法。
	需要對象在初始化的時候擁有“長”和“寬”兩個參數,
	因此我們要重寫__init__()方法,因爲__init__()方法是類在實例化成對象的時候
	首先調用的一個方法。
	"""
	def __init__(self, x, y):
		self.x = x
		self.y = y
	def getPeri(self):
		# 計算周長
		return (self.x + self.y) * 2
	def getArea(self):
		# 計算面積
		return self.x * self.y

	
>>> rect = Rectangle(3, 4)
>>> # 得到周長
>>> rect.getPeri()
14
>>> # 得到面積
>>> rect.getArea()
12

我個人覺得這樣來說比較明白一點,在一個類中,定義了不同的方法,而這些方法都要用到同一組屬性,這樣,我們就可以重寫__init__()方法,在初始化實例對象的時候直接將該組屬性與實例對象綁定,然後就可以帶着該組屬性去調用不同的方法,得到不同的結果。

__new__()

其實,在一個對象被實例化的時候,調用的第一個方法並不是init,而是new方法,new方法返回一個該類的實例對象,new方法跟其他的方法不同,他的第一個參數不是self,而是這個類(cls),其他的參數都會傳遞給init方法,平時一般很少重寫new方法,讓python用默認方案執行就可以了,除非你是繼承了一個不可變類型,比如說(str、tuple、list)等等,new方法就顯得很重要了:

>>> class CapStr(str):
	# 繼承不可變類型str,重寫__new__()
		def __new__(cls, string):
			string = string.upper()
			# 我們只重寫我們需要的內容,其他的一切都交給python的默認機制來完成就行
			return str.__new__(cls, string)

	
>>> a = CapStr("I'm spiderman")
>>> a
"I'M SPIDERMAN"

__del__()

__del__()方法是python的析構器,在一個對象將要被銷燬時調用,並不是使用了del關鍵字,這個方法就會被調用,而是在一個對象的引用計數爲0的時候,也就是垃圾回收機制要回收這個對象的時候,__del__()方法纔會被調用。

>>> class A:
	def __init__(self):
		print('我是__init__方法,我正在被調用....')
	def __del__(self):
		print('我是__del__方法,我正在被調用....')

		
>>> a1 = A()
我是__init__方法,我正在被調用....
>>> a2 = a1			# a1的引用計數+1
>>> a3 = a2         # a1的引用計數+1
>>> del a3			# a1的引用計數-1
>>> del a2    		# a1的引用計數-1
>>> del a1			# a1的引用計數-1,此刻a1的引用計數爲0,調用__del__()方法
我是__del__方法,我正在被調用....
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章