零基础入门学习Python(21):魔法方法(1)构造和析构
从这节开始,我们介绍下Python的魔法方法:魔法方法总是被双下划线包围。
之前有提到过初始化的魔法方法__init__()
,它返回None,在类定义时有时写__init__()
方法,有时不写,只有当我们需要对一个对象进行初始化操作时,才会重写__init__()
方法。
>>> class Rectangle:
def __init__(self,x,y): #默认是没有参数的,但这里需要传入两个参数,即需求,所以重写了__init__方法
self.x = x
self.y = y
def area(self):
return self.x * self.y
>>> rect = Rectangle(2,3)
>>> rect.area()
6
下面介绍另一个初始化的魔法方法,实际上,下面这个魔法方法才是创建对象时第一个要调用的方法:
__new__(cls[, ...])
: 是对象实例化的时候所调用的第一个方法,它第一个参数是 class ,后面有其他参数时,会原封不动的传给__init__()
方法,很少被重写。
1)需要一个实例对象作为返回值;
2)当继承一个不可变类型,又需要进行修改的时候,重写
>>> class SortedList(list): #继承列表,list是不可修改的
def __new__(cls, list1): #传入一个列表list1
list1 = list.sort(list1) #调用列表的内置方法sort(),把list1重写之后,让list调用
return list.__new__(cls,list1) #返回一个实例对象
>>> l = SortedList([3,4,2,8,6,10,3,5])
>>> l #重写之后,直接调用就可以得到排序之后的列表
[2, 3, 3, 4, 5, 6, 8, 10]
最后再介绍一下Python中的析构器:
__del__(self)
: 析构器,对象生成之后,当所有对它的引用都被 del 之后,会启动垃圾回收机制,当垃圾回收机制销毁对象的时候,就会调用这个方法。
>>> class Test:
def __init__(self):
print(' I am __init__ method, I am being called...')
def __del__(self):
print(' I am __del__ method, I am being called...')
>>> c1 = C() #生成一个实例化对象c1,调用了__init__()方法
I am __init__ method, I am being called...
>>> c2 = c1 #c2也指向c1这个对象的内存
>>> c3 = c2 #c3也指向c1这个对象的内存,即此时有3个名字指向同一块内存区域
>>> del c3
>>> del c2
>>> del c1 #删除出c3、c2、c1之后,没有名字再指向这个内存了,所以就自动调用了__del__魔法方法来销毁这个对象
I am __del__ method, I am being called...