python构造和析构_python魔法方法 构造和析构实例讲解
目錄:
一、_ _init_ _(self[, ...])
二、_ _new_ _(cls[, ...])
三、_ _del_ _(self)
四、課時(shí)41課后習(xí)題及答案
說的那么厲害,那什么是魔法方法呢?
(1)魔法方法總是被雙下劃線包圍,例如_ _init_ _()。
(2)魔法方法是面對(duì)對(duì)象的Python的一切。
(3)魔法方法的“魔力”體現(xiàn)在它們總能夠在適當(dāng)?shù)臅r(shí)候被調(diào)用。
**************************
一、_ _init_ _(self[, ...])
**************************
之前我們討論過?_ _init_ _()方法,說它相當(dāng)于其它面向?qū)ο缶幊陶Z言的構(gòu)造方法,也就是類在實(shí)例化成對(duì)象的時(shí)候首先會(huì)調(diào)用的一個(gè)方法。
也許你會(huì)問:“有些時(shí)候在定義時(shí)寫_ _init_ _()方法,有些時(shí)候卻沒有,這是為什么呢?”舉個(gè)例子:
#p12_1.py
classRectangle:"""定義一個(gè)矩形類,
需要長(zhǎng)和寬兩個(gè)數(shù)據(jù),
擁有計(jì)算周長(zhǎng)和面積的兩個(gè)辦法。
擁有對(duì)象在初始化的時(shí)候擁有"長(zhǎng)"和"寬"兩個(gè)參數(shù),
因此需要重寫_ _init_ _()方法,因?yàn)槲覀冋f過,
_ _init_ _()方法是類在實(shí)例化成對(duì)象的時(shí)候首先會(huì)調(diào)用的一個(gè)方法,"""
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
>>> #先運(yùn)行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'
所以一般在需要進(jìn)行初始化的時(shí)候才重寫__init__()方法。其實(shí),這個(gè)__init__()并不是實(shí)例化對(duì)象時(shí)第一個(gè)被調(diào)用的魔法方法。
***************************
二、_ _new_ _(cls[, ...])
***************************
_ _new_ _()才是在一個(gè)對(duì)象實(shí)例化的時(shí)候所調(diào)用的第一個(gè)方法。它跟其它魔法方法不同,它的第一個(gè)參數(shù)不是self而時(shí)這個(gè)類(cls),而其它參數(shù)會(huì)直接傳遞給_ _init_ _()方法的。
_ _new_ _()方法需要返回一個(gè)實(shí)例對(duì)象,通常是cls這個(gè)類實(shí)例化的對(duì)象,當(dāng)然你也可以返回其它對(duì)象。
_ _new_ _()方法平時(shí)很少去重寫它,一般讓Python用默認(rèn)的方案執(zhí)行就可以了。但是又一種情況需要重寫這個(gè)魔法方法,就是當(dāng)繼承一個(gè)不可變的類型的時(shí)候,它的特性就顯得尤為重要了。
>>> 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)這種做法是值得推崇的,只需要重寫我們關(guān)注的那部分內(nèi)容,然后其它的瑣碎東西交給Python的默認(rèn)機(jī)制去完成就可以了,畢竟它們出錯(cuò)的幾率要比我們自己寫小很多。
*********************
三、_ _del_ _(self)
*********************
如果說__init__()和__new__()方法是對(duì)象的構(gòu)造器的話,那么Python也提供了一個(gè)析構(gòu)器,叫做__del__()方法。當(dāng)對(duì)象將要被銷毀的時(shí)候,這個(gè)方法就會(huì)被調(diào)用。但一定要注意的是,并非del x就相當(dāng)于自動(dòng)調(diào)用x.__del__(),__del__()方法是當(dāng)垃圾回收這個(gè)對(duì)象的時(shí)候調(diào)用的。舉個(gè)例子:
>>> classC:def __init__(self):print("我是__init__()方法,我被調(diào)用了...")def __del__(self):print("我是__del__()方法,我被調(diào)用了...")>>> c1 =C()
我是__init__()方法,我被調(diào)用了...>>> c2 =c1>>> c3 =c2>>> delc1>>> delc2>>> delc3
我是__del__()方法,我被調(diào)用了...
*******************************
四、課時(shí)41課后習(xí)題及答案
*******************************
總結(jié)
以上是生活随笔為你收集整理的python构造和析构_python魔法方法 构造和析构实例讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度首艘国产航母最新消息
- 下一篇: python 上传文件到网络设备_基于p