• 【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
    >>>
  • 相关阅读:
    QT 读写sqllite数据库
    SQLLite 简介
    arcengine 开发经典帖 【强烈推荐仔细研读】
    IHookHelper的用法
    ArcSDE中Compress与Compact的区别
    以Network Dataset(网络数据集)方式实现的最短路径分析
    ArcGIS网络概述
    ClassLoader.getResourceAsStream(name);获取配置文件的方法
    Xml中SelectSingleNode方法,xpath查找某节点用法
    Spring整合JUnit4测试使用注解引入多个配置文件
  • 原文地址:https://www.cnblogs.com/frankruby/p/9790259.html
Copyright © 2020-2023  润新知