python041--构造方法:构造和析造
Posted frankruby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python041--构造方法:构造和析造相关的知识,希望对你有一定的参考价值。
一、魔法方法
1、魔法方法总是被双下划线包围,例如:__init__
2、为什么在类实例化的时候,有时候需要构造__init__,有时候不需要呢
举例说明: #定义一个矩形的类,需要长和宽两个参数,计算矩形的周长和面积 #我们需要对象在初始化的时候拥有长和宽两个参数,因此我们需要重写__init__方法 In [1]: class Rectangle: ...: 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 ...: In [2]: rect = Rectangle(3,4) In [3]: rect.getPeri() Out[3]: 14 In [4]: rect.getArea() Out[4]: 12 注意:__init__()构造方法不能直接返回
3、__new(cls[,...]) :实例化对象被调用的第一个魔法方法,它跟其他的魔法方法不一样,
它的第一个参数不是self,而是这个类cls . 一般Python是默认的不需要重写,但是有一种情况需要重写__new__()方法,什么情况呢?即:当继承一种不可变类型时,又需要修改时就需要重写__new__()方法
举例: #大写字符串继承str类型,需要把输入的字符串变成大写的字符串,但是由于str类是不可变得类型,这时候就需要用到__new__()方法进行重写,已达到把输入的字符串变成大写字符串 >>> class CapStr(str): def __new__(cls,string): string = string.upper() return str.__new__(cls,string) >>> cap = CapStr("i love ai") >>> cap ‘I LOVE AI‘
4、__del__(self): 销毁实例化对象时,才会被调用并释放内存
举例: In [16]: class C: ...: def __init__(slef): ...: print(‘我是__init__方法,我被调用了!‘) ...: def __del__(self): ...: print(‘我是__new__方法,我被调用了!‘) ...: In [17]: c=C In [18]: c1 = C() 我是__init__方法,我被调用了! In [19]: c2 = c1 In [20]: c3 = c2 In [21]: del c3 In [22]: del c2 In [23]: del c1 我是__new__方法,我被调用了! #由此代码可以看出,只有销毁实例化对象c1的时候才会调用__del__()方法
二、动手题
1、写一个FileObject类,给文件对象进行包装,从而确认在删除对象时文件能自动关闭
class FileObject: ‘‘‘给文件对象进行包装从而在删除时自动关闭文件‘‘‘ def __init__(self,filename=‘42.py‘): #读写模式打开一个文件 self.new_file = open(filename,‘r‘) def __del__(self): self.new_file.close() del self.new_file ‘‘‘ |--先打开文件并赋值给self.new_file |--关闭文件self.new_file.close() |--删除文件流释放内存del self.new_file ‘‘‘
2、按照一下要求,定义一个类实现摄氏度到华氏度的转换(转换公式:华氏度= 摄氏度*1.8+32)
>>> class C2F(float): def __new__(cls,arg=0.0): return float.__new__(cls,arg*1.8+32) >>> c2f = C2F(32) >>> C2F <class ‘__main__.C2F‘> >>> c2f 89.6 >>>
3、定义一个int类型,并实现一个特殊功能:当传入的参数是字符串的时候,返回该字符串找那个所有字符的ASCII码和(使用ord()获得一个字符的ASCII码值)
--知识点:
>>.isinstance():此函数判断一个对象是否是已知的类型,例如:type isinstance()和type()的区别: isinstance():子类的数据类型和父类的类型时同一种,考虑继承关系 type():不会考虑子类的数据类型是否和父类的数据类型是不是一样,不考虑继承关系 语法:isinstance(object,classinfo):object:实例对象,classInfo:直接或间接的类名
>> ord()函数:此函数是chr()函数(对于8位的ASCII字符串)和unichr(对于Unicode对象)函数的配比函数,他以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。如果给出的Unicode字符超出了你的Python定义范围,则会引发一个TypeError的异常 语法:ord(c):c:字符 >>> ord(‘c‘) 99 >>>
class INIT(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(INIT(‘R‘))
82
>>> print(INIT(5))
5
>>> print(INIT(5.6))
5
>>>
以上是关于python041--构造方法:构造和析造的主要内容,如果未能解决你的问题,请参考以下文章