魔法方法總是被雙下划線包圍,例如:__init__()
魔法方法是面向對象的python的一切,它的魔力體現在總能在合適的時候調用。
先來介紹析構和構造的三個魔法方法:
__init__():構造方法,類在實例化成對象的時候會首先調用這個方法(可選,根據需求)
__new__():才是在一個對象實例化的時候所調用的一個方法,與其他魔方方法不同,它的第一個參數是cls(類),其他參數會傳給__init__()
__del__():如果說__init__()和__new__()是對象的構造器話,__del__()方法將是打工對象被銷毀時調用
1、__init__(self[,...])
實例:
1 classRectangle:2 '''
3 定義個一個矩形列,需要長寬兩個參數4 需要對象在初始化的時候擁有長寬兩個參數,因此需要重寫__init__()方法5 '''
6 def __init__(self,x,y): #__init__()返回值一定是None,所以不需要return語句
7 self.x =x8 self.y =y9 defgetPerl(self):10 return (self.x + self.y) * 2
11 defgetArea(self):12 return self.x *self.y13
14 rect = Rectangle(3,4)15 print(rect.getArea(),rect.getPerl())
打印結果:
14
12
這里需要注意的是,__init__()方法的返回值一定是None,不能是其他,否則將報錯:
1 classA():2 def __init__(self):3 return "A"
4
5 cup = A()
執行結果:
Traceback (most recent call last):
File"", line 1, in cup=A()
TypeError:__init__() should return None, not 'str'
所以一般在需要進行初始化的時候才重寫__init__()方法,其實__init__()並不是實例化對象時第一個被調用的魔法方法
2、__new__(cls[,...])
__new__()才是在實例化對象時所調用的第一個方法。它跟其他魔法方法不同,它的第一個參數不適合self而是類(cls),而其他的參數會直接傳遞給__init__()方法
__new__()方法需要返回一個實例化對象,通常是cls這個實例化的對象,當然也可以返回其他對象。
__new__()方法平時很少去重寫它,一般讓python用默認的方案執行就可以了。但是有一種情況需要重寫這個魔法方法,就是當繼承一個不可變類型的時候,它的特性就尤為重要了。
1 classCapStr(str):2 def __new__(cls,string):3 string =string.upper()4 return str.__new__(str,string) #這里一定是返回繼承類的__new__()方法,否則容易造成死循環
5
6 capstr = CapStr('good afternoon')7 print(capstr)8
9 #結果為:GOOD AFTERNOON
這里返回的str.__new__(str,string)做法是很值得推薦的,只需要重寫關組的內容,其他的瑣碎東西交給python的默認機制去完成就可以了,畢竟python本身比我們自己寫的要好很多
3、__del__(self)
如果說__init__()和__new__()方法是對象的構造器的話,那么python也析構了一個構造器,__del__()方法,當對象被銷毀時,這個方法就一定會被調用,但要注意的是,並非del x就等同於自動調用了x.__del__(),__del__()方法是當垃圾回收機制回收這個對象的時候調用的
>>> classC():def __init__(self):print('我是__init__()方法')def __del__(self): \print('我是__del__()方法')>>> c1 =C()
我是__init__()方法>>> c2 =c1>>> c3 =c2>>> delc1>>> delc2>>> delc3
我是__del__()方法