魔法方法
1、python中的魔法方法总是被双下划线__包围,比如:__init__();
2、魔法方法的魔法就体现在他们会在需要的时候被自动调用。
构造函数与析构函数
构造函数
1、用于初始化类的内部状态,python提供的类构造函数__init__()与__new__();
2、__init__():__init__()方法是可选的,如果没有定义,则使用默认的__init__()方法;
3、__new__():__new__()方法也是可选的,而且平时也很少去重写他,只有当继承一个不可变类型的时候,才会对其进行重写。
析构函数
1、用于回收对象的资源,python提供的析构函数__del__();
2、__del__()函数也是可选的,如果没有定义,python会在后台提供默认的析构函数;
3、如果要显式的调用析构函数,可以使用del关键字。
__init__()
构造函数,用于初始化类内部的状态,初始化实例对象,返回值只能为None
>>> class Rectangle:
"""
定义一个矩形类,
需要长和宽两个参数,
拥有计算周长和面积两个方法。
需要对象在初始化的时候拥有“长”和“宽”两个参数,
因此我们要重写__init__()方法,因为__init__()方法是类在实例化成对象的时候
首先调用的一个方法。
"""
def __init__(self, x, y):
self.x = x
self.y = y
def getPeri(self):
# 计算周长
return (self.x + self.y) * 2
def getArea(self):
# 计算面积
return self.x * self.y
>>> rect = Rectangle(3, 4)
>>> # 得到周长
>>> rect.getPeri()
14
>>> # 得到面积
>>> rect.getArea()
12
我个人觉得这样来说比较明白一点,在一个类中,定义了不同的方法,而这些方法都要用到同一组属性,这样,我们就可以重写__init__()方法,在初始化实例对象的时候直接将该组属性与实例对象绑定,然后就可以带着该组属性去调用不同的方法,得到不同的结果。
__new__()
其实,在一个对象被实例化的时候,调用的第一个方法并不是init,而是new方法,new方法返回一个该类的实例对象,new方法跟其他的方法不同,他的第一个参数不是self,而是这个类(cls),其他的参数都会传递给init方法,平时一般很少重写new方法,让python用默认方案执行就可以了,除非你是继承了一个不可变类型,比如说(str、tuple、list)等等,new方法就显得很重要了:
>>> class CapStr(str):
# 继承不可变类型str,重写__new__()
def __new__(cls, string):
string = string.upper()
# 我们只重写我们需要的内容,其他的一切都交给python的默认机制来完成就行
return str.__new__(cls, string)
>>> a = CapStr("I'm spiderman")
>>> a
"I'M SPIDERMAN"
__del__()
__del__()方法是python的析构器,在一个对象将要被销毁时调用,并不是使用了del关键字,这个方法就会被调用,而是在一个对象的引用计数为0的时候,也就是垃圾回收机制要回收这个对象的时候,__del__()方法才会被调用。
>>> class A:
def __init__(self):
print('我是__init__方法,我正在被调用....')
def __del__(self):
print('我是__del__方法,我正在被调用....')
>>> a1 = A()
我是__init__方法,我正在被调用....
>>> a2 = a1 # a1的引用计数+1
>>> a3 = a2 # a1的引用计数+1
>>> del a3 # a1的引用计数-1
>>> del a2 # a1的引用计数-1
>>> del a1 # a1的引用计数-1,此刻a1的引用计数为0,调用__del__()方法
我是__del__方法,我正在被调用....