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--构造方法:构造和析造的主要内容,如果未能解决你的问题,请参考以下文章

使用Python定义构造函数和析构函数

python魔法方法之构造和析构

Python编程基础17:构造方法和析构方法

python中的构造函数和构造函数和析构函数的作用

php构造函数的PHP 5 构造函数和析构函数

[转]python self类构造和析构方法 简单学习