《零基础入门学习Python》(41)魔法方法:构造和析构

知识点:

  • 什么是魔法方法:魔法方法总是被双下划线包围,例如__init__ 魔方方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大。魔法方法的“魔法”体现在他们总能在适当的时候被自动调用。
  • __init__(self[, ...])魔法方法——需求,使用这个魔法方法时,可以让用户输入自己需要的数句,就跟有参数的函数一样。
>>> class Rectangle:
	def __init__(self,x,y):
		self.x = x
		self.y = y
	def getPero(self):
		return(self.x+self.y)*2
	def getArea(self):
		return self.x*self.y

	
>>> rect = Rectangle(3,4)
>>> rect.getPero()
14
>>> rect.getArea()
12

注意__init__魔法方法返回值一定是None对象的一个返回值

>>> class A:
	def __init__(self):
		return 'A for A - CUP'

	
>>> a=A()
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    a=A()
TypeError: __init__() should return None, not 'str'
  • __new__(cls[, ...])——它才是对象实例化调用的第一个方法,他的第一个参数是class,如果后面有参数的时候,他会将其原封不动的传递给__init__()方法,并且他需要返回一个实例对象作为一个返回值,通常是返回class这个类的实例对象(这个方法其实我也不太懂,做到课后题的时候再看看吧
>>> class CapStr(str):
	def __new__(cls,string):
		string = string.upper()
		return str.__new__(cls,string)

	
>>> a=CapStr('go go go %%')
>>> a
'GO GO GO %%'
  • __del__(self)——如果说__new__()和__init__()是对象的构造器的话,那么Python提供了一个析构器就是__del__()方法
>>> class C:
	def __init__(self):
		print("我是init方法,我被调用了...")
	def __del__(self):
		print('我是del方法,我被调用了...')

		
>>> c1=C()
我是init方法,我被调用了...
>>> c2=c1
>>> c3=c2
>>> del c3
>>> del c2
>>> del c1
我是del方法,我被调用了...

#只有当相关的引用都被删除了之后才会启动__del__()

测试题

0.是哪个特征让我们一眼就能认出这货是魔法方法?

答:魔方方法总是被双下划线包围,例如__init__

1.类事例化对象所调用的第一个方法是什么?

答:__new__是在一个对象实例化的时候所调用的第一个方法。它跟其他魔方方法不同,他的第一个参数不是self而是这个类cls,而其他的参数会直接传递给__init__方法的。

2.什么时候我们需要在类中明确写出__init__方法?

答:当我们的实例对象需要有明确的初始化步骤的时候,你可以在__init__方法中部署初始化的代码。

>>> class Rectangle:
	def __init__(self,x,y):
		self.x = x
		self.y = y
	def getPero(self):
		return(self.x+self.y)*2
	def getArea(self):
		return self.x*self.y

	
>>> rect = Rectangle(3,4)
>>> rect.getPero()
14
>>> rect.getArea()
12

3.请问下面代码存在什么问题?

>>> class Test:
	def __init__(self,x,y):
		return x+y

4.请问__new__方法是负责什么任务?

答:__new__方法主要任务是返回一个实例对像,通常是参数cls这个类的实例化对象,当然你也可以返回其他对象。

5.__del__魔方方法什么时候会被自动调用?

答:如果说__init__和__new__方法是对象的构造器的话,那么Python也提供了一个析构器,叫做__del__方法,当对象将要被销毁的时候,这个方法就会被调用。

动动手

0.小李做事常常丢三落四,写代码也是一样,常常打开了文件又忘记关闭。你能不能写一个FileObject类,给文件对象进行包装,从而确定在删除对象时文件能自动关闭?

答:只有灵活搭配__init__和__del__魔法方法,即可做到收放自如。

class FileObject:
	'''给文件对象进行包装从而确认再删除是文件流关闭'''
	def __init__(self,filename='sample.txt'):
		#读写模式打开一个文件
		self.new_file = open(filename,'r+')
	def __del__(self):
		self.new_file = close()
		del self.new_file

1.按照以下要求,定义一个类实现摄氏度到华氏度的转化(转化公式:华氏度=摄氏度*1.8+32)

要求:我们希望这个类尽量简练地实现功能,如下:

>>> class C2F(float):
	def __new__(cls,arg=0.0):
		return float.__new__(cls,arg*1.8+32)

到现在大致了解了__new__()魔法方法的作用,相当于一个可以返回继承类相关的类型的__init__()魔法方法

2.定义一个类继承于int类型,并实现一个特殊功能:当传入的参数是字符串的时候,返回该字符串中所有字符的ASCLL码的和(使用ord()获得一个字符的ASCLL码值)。

>>> class Nint(int):
	def __new__(cls,arg=0):
		if isinstance(arg,str):
			total = 0
			for each in arg:
				total += ord(each)
			arg = total
		return int.__new__(cls,arg)

	
>>> print(Nint(123))
123
>>> print(Nint(1.5))
1
>>> print(Nint('A'))
65
>>> print(Nint('FishC'))
461

猜你喜欢

转载自blog.csdn.net/qq_38721302/article/details/83785747