python魔法方法和普通方法_python_魔法方法(一):構造和析構

魔法方法總是被雙下划線包圍,例如:__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__()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值