自学Python:python中的魔法方法

魔法方法

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__方法,我正在被调用....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值