知识点:
- 什么是魔法方法:魔法方法总是被双下划线包围,例如__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