python构造和析构_python魔法方法 构造和析构实例讲解
目錄:
一、_ _init_ _(self[, ...])
二、_ _new_ _(cls[, ...])
三、_ _del_ _(self)
四、課時41課后習題及答案
說的那么厲害,那什么是魔法方法呢?
(1)魔法方法總是被雙下劃線包圍,例如_ _init_ _()。
(2)魔法方法是面對對象的Python的一切。
(3)魔法方法的“魔力”體現在它們總能夠在適當的時候被調用。
**************************
一、_ _init_ _(self[, ...])
**************************
之前我們討論過?_ _init_ _()方法,說它相當于其它面向對象編程語言的構造方法,也就是類在實例化成對象的時候首先會調用的一個方法。
也許你會問:“有些時候在定義時寫_ _init_ _()方法,有些時候卻沒有,這是為什么呢?”舉個例子:
#p12_1.py
classRectangle:"""定義一個矩形類,
需要長和寬兩個數據,
擁有計算周長和面積的兩個辦法。
擁有對象在初始化的時候擁有"長"和"寬"兩個參數,
因此需要重寫_ _init_ _()方法,因為我們說過,
_ _init_ _()方法是類在實例化成對象的時候首先會調用的一個方法,"""
def __init__(self,x,y):
self.x=x
self.y=ydefgetPeri(self):return (self.x + self.y) * 2
defgetArea(self):return self.x * self.y
>>> #先運行p12_1.py
>>> rect = Rectangle(3,4)>>>rect.getPeri()14
>>>rect.getArea()12
這里需要注意的是,_ _init_ _()方法的返回值一定是None,不能是其它:
>>> classA:def __init__(self):return "A for A - Cup"
>>> cup =A()
Traceback (most recent call last):
File"", line 1, in cup=A()
TypeError:__init__() should return None, not 'str'
所以一般在需要進行初始化的時候才重寫__init__()方法。其實,這個__init__()并不是實例化對象時第一個被調用的魔法方法。
***************************
二、_ _new_ _(cls[, ...])
***************************
_ _new_ _()才是在一個對象實例化的時候所調用的第一個方法。它跟其它魔法方法不同,它的第一個參數不是self而時這個類(cls),而其它參數會直接傳遞給_ _init_ _()方法的。
_ _new_ _()方法需要返回一個實例對象,通常是cls這個類實例化的對象,當然你也可以返回其它對象。
_ _new_ _()方法平時很少去重寫它,一般讓Python用默認的方案執行就可以了。但是又一種情況需要重寫這個魔法方法,就是當繼承一個不可變的類型的時候,它的特性就顯得尤為重要了。
>>> classCapStr(str):def __new__(cls,string):
string=string.upper()return str.__new__(cls,string)>>> a = CapStr("I love ZWW")>>>a'I LOVE ZWW'
這里返回str.__new__(cls,string)這種做法是值得推崇的,只需要重寫我們關注的那部分內容,然后其它的瑣碎東西交給Python的默認機制去完成就可以了,畢竟它們出錯的幾率要比我們自己寫小很多。
*********************
三、_ _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__()方法,我被調用了...
*******************************
四、課時41課后習題及答案
*******************************
總結
以上是生活随笔為你收集整理的python构造和析构_python魔法方法 构造和析构实例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度首艘国产航母最新消息
- 下一篇: python 上传文件到网络设备_基于p