(董付国)Python 学习笔记---Python面向对象程序设计(3)

2023-11-08

6.4.2 案例精选

  • 例6-1:自定义数组。在MyArray.py文件中,定义了一个数组类,重写了一部分特殊方法以支持数组之间、数组与整数之间的四则运算以及内积、大小比较、成员测试和元素访问等运算符。
class MyArray:                                              # 在内部封装/隐藏了一个列表
    '''All the elements in this array must be numbers'''

    def __IsNumber(self,n):                                 #定义了一个私有的成员方法
        return isinstance(n,(int,float,complex))

    def __init__(self,*args):                               #类的构造方法,‘*’可变长度参数
        if not args:
            self.__value = []                               #如果传值不是int,float,complex则给个空列表包装成数组
        else:
            for arg in args:
                if not self.__IsNumber(arg):
                    print('All elements must be numbers')
                    return
                self.__value = list(args)

    #重载运算符+
    #数组中每个元素都与数字n相加,或两个数组相加,返回新数组
    def __add__(self,n):
        if self.__IsNumber(n):
            #数组中所有元素都与数字n相加
            b = MyArray()                                   #构建一个空数组
            b.__value = [item+n for item in self.__value]   #列表推导式
            return b
        elif isinstance(n,MyArray):                         #MyArray是一个数组类型
            if len(n.__value) == len(self.__value):
                c = MyArray()
                c.__value = [i+j for i,j in zip(self.__value,n.__value)]
                return c
            else:
                print('Length not equal')
        else:
            print('Not supported')

    #重载运算符-
    #数组中每个元素都与数字n相减,返回新数组
    def __sub__(self,n):
        if not self.__IsNumber(n):
            #减法对于n的类型和数字类型之间不支持操作
            print('- operating with ',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item-n for item in self.__value]
        return b

    #重载运算符*
    #数组中每个元素都与数字n相乘,返回新数组
    def __mul__(self,n):
        if not self.__IsNumber(n):
            #乘法对于n的类型和数字类型之间不支持操作
            print('* operating with ',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item*n for item in self.__value]
        return b
    
    #重载运算符/
    #数组中每个元素都数字n相除,返回新数组
    def __truediv__(self,n):
        if not self.__value(n):
            #除法对于n的类型和数字不支持操作
            print(r'/ operating with',type(n),'and number is not supported.')
            return
        b = MyArray()
        b.__value = [item/n for item in self.__value]
        return b

    #重载运算符//
    #数组中每个元素都与数字n整除,返回新数组
    def __floordiv__(self,n):
        if not isinstance(n,int):
            print(n,' in not an integer')
            return
        b = MyArray()
        b.__value = [item//n for item in self.__value]

    #重载运算符%
    #数组中每个元素都数字n求余数,返回新数组
    def __mod__(self,n):
        if not self.__value(n):
            print(r'% operating with',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item%n for item in self.__value]
        return b

    #重载运算符**
    #数组中每个元素都数字n求幂运算,返回新数组
    def __pow__(self,n):
        if not self.__value(n):
            print(r'** operating with',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item**n for item in self.__value]
        return b

    def __len__(self):
        return len(self.__value)

    #直接使用该对象作为表达式来查看对象的值
    def __repr__(self):
        return repr(self.__value)

    #支持使用print()查看对象的值
    def __str(self):
        return str(self.__value)

    #追加元素
    def append(self,v):
        assert self.__IsNumber(v),'Only number can be appended.'        #如果v满足条件则返回数组,否则抛出异常

    #获取指定下标的元素值,支持使用列表或元组指定多个下标
    def __getitem__(self,index):
        length = len(self.__value)
        #如果指定单个整数作为下标,直接返回元素值
        if isinstance(index,int) and 0<=index<=length:
            return self.__value[index]
        elif isinstance(index,(list,tuple)):
            for i in index:
                if not (isinstance(i,int) and 0<=i<=length):
                    return 'index error'
            result = []
            for item in index:
                result.append(self.__value[item])
            return result
        else:
            return 'index error'

    #修改元素值,支持使用列表或元组指定多个下标,同时修改多个元素值
    def __setitem__(self,index,value):
        length = len(self.__value)
        #如果下标合法,则直接修改元素
        if isinstance(index,int) and 0<=index<=length:
            self.__value[index] = value
        #支持使用列表或元组指定多个下标
        elif isinstance(index,(list,tuple)):
            for i in index:
                if not isinstance((i,int) and 0<=i<=length):
                    raise Exception('index error')
                #如果下标和给的值都是元组或列表,并且个数一样,则分别为多个下标的元素修改值
                if isinstance(value,(list,tuple)):
                    if len(index) == len(value):
                        for i,v in enumerate(index):
                            self.__value[v] = value[i]
                    else:
                        raise Exception('value and index must be of the same length')
                #如果指定多个下标和一个普通值,则把多个元素修改为相同的值
                elif isinstance(value,(int,float,complex)):
                    for i in index:
                        self.__value[i] = value
                else:
                    raise Exception('value error')
        else:
            raise Exception('index error')

    #支持成员测试运算符in,测试数组中是否包含某个元素
    def __contains__(self,v):
        return v in self.__value

    #模拟向量内积
    def dot(self,v):
        if not isinstance(v,MyArray):
            print(v,' must be an instance of MyArray.')
            return
        if len(v) != len(self.__value):
            print('The size must be equal.')
            return
        return sum([i*j for i,j in zip(self.__value,v.__value)])

    #重载运算符==,测试两个数组是否相等
    def __eq__(self,v):
        assert isinstance(v,MyArray),'wrong type'
        return self.__value == v.__value

    #重载运算符<,比较两个数组大小
    def __lt__(self,v):
        assert isinstance(v,MyArray),'wrong type'
        return self.__value < v.__value

if __name__ == '__main__':
    print('Please use me as a module.')


    





            
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(董付国)Python 学习笔记---Python面向对象程序设计(3) 的相关文章

  • 一个人才数据网的爬虫软件

    最近表哥让我帮他写个软件 定时爬取一个人才数据网站的信息 思路和方法很简单 不过过程中遇到的坑真的不少 今天对整个软件的开发过程做个记录 网站是 余姚人才网 链接就不上了 百度第一个就是 还是老样子 python request beaut
  • numpy的numpy.delete()/insert()/append()函数

    1 numpy delete arr obj axis None arr 输入向量 obj 表明哪一个子向量应该被移除 可以为整数或一个int型的向量 axis 表明删除哪个轴的子向量 若默认 则返回一个被拉平的向量 a np array
  • Pandas学习之to_csv()

    用法 df to csv 输出路径 参数1 参数2 参数3 sep 以逗号 作为数据的分隔符 如果分隔符不为逗号 则包含符双引号 就会消失 分隔符为Tab时 写法如下 df to csv new csv sep t na rep NA 确实
  • Python打包为exe可执行文件(含打包图片、音乐方法 + 彻底隐藏cmd黑窗口 + 解决打包程序过大)

    pyinstaller模块打包exe 基本使用方法 安装模块 pip install pyinstaller 命令行cd到Python主程序文件所在的目录 使用格式 pyinstaller F w i x ico xxx py pyinst
  • Python之线程编程(Thread)

    线程基本概念 1 什么是线程 1 线程被称为轻量级的进程 2 线程也可以使用计算机多核资源 是多任务编程方式 3 线程是系统分配内核的最小单元 4 线程可以理解为进程的分支任务 2 线程特征 1 一个进程中可以包含多个线程 2 线程也是一个
  • Python语言:列表初体验

    列表是Python中的一个对象 他类似于C语言中的数组 可以存储许多数据 也可以称之为数据集合 他原则是可以存储不同类型的数据 一般不建议这样使用 有点奇怪 一般情况下一个列表中保存的都是同一种类型的数据 列表的创建 列表 list 是把数
  • Numpy&Pandas 数据处理与挖掘

    笔记来源B站 https www bilibili com video BV1xt411v7z9 p 21 python学习笔记 1 Numpy 1 1 Numpy优势 1 1 1 Numpy介绍 1 1 2 ndarray介绍 1 1 3
  • python学习笔记——hashlib模块

    上篇 https blog csdn net qq 42489308 article details 89813895 hashlib Hash 译做 散列 也有直接音译为 哈希 的 把任意长度的输入 通过某种hash算法 变换成固定长度的
  • Python爬虫之正则表达式

    正则表达式 正则表达式就是规则表达式 在接触爬虫前 正则表达式就是用来过滤的 接触爬虫后发现真的就是过滤用的hhh 正则表达式在爬虫中的作用就是过滤出想要的字符 然后获取 如果不用正则表达式 那么就会将网页中大量信息全部爬出 造成大量内存浪
  • python --- 之pil图像转换的一些方式

    在数字图像处理中 针对不同的图像格式有其特定的处理算法 所以 在做图像处理之前 我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现 本文基于这个需求 使用python中的图像处理库PIL来实现不同图像格式的转换 对于彩色图像 不管
  • 【Python_Selenium学习笔记(三)】基于Selenium模块实现无界面模式 & 执行JS脚本(把滚动条拉到底部)

    基于Selenium模块实现无界面模式 执行JS脚本 把滚动条拉到底部 前言 此篇文章主要介绍如何使用 Selenium 模块实现 无界面模式 执行JS脚本 把滚动条拉到底部 并以具体的示例进行展示 正文 1 Selenium 设置无界面模
  • (董付国)Python 学习笔记---Python面向对象程序设计(3)

    6 4 2 案例精选 例6 1 自定义数组 在MyArray py文件中 定义了一个数组类 重写了一部分特殊方法以支持数组之间 数组与整数之间的四则运算以及内积 大小比较 成员测试和元素访问等运算符 class MyArray 在内部封装
  • Python3学习实战——用类实现简单的猜拳游戏

    Python3学习实战 用类实现简单的猜拳游戏 前言 本笔记仅个人认知和见解 水平有限 还请见谅 如有错误 还请指出 若有想法 欢迎共享 内容不代表最优解决方案 甚至可能不是很好的方法 仅供参考 文章目录 Python3学习实战 用类实现简
  • 【Python】用xpath爬取网页文字保存到txt中(含有文字解码代码)

    本文收录于 python学习笔记 专栏 这个专栏主要是我学习Python中遇到的问题 学习的新知识 或总结的一些知识点 我也是初学者 可能遇到的问题和大部分新人差不多 在这篇专栏里 我尽可能的分享出我学习的内容 专栏在持续更新中 hello
  • 字符串有关习题

    0 请问下面代码有没有毛病 为什么 1 gt gt gt input I love FishC com 2 gt gt gt print input 3 I love FishC com 答 有问题 给变量命名要避免与内置函数名字冲突 1
  • 【Python_PySide2学习笔记(一)】PySide2动态加载UI方式,重写关闭窗体事件

    PySide2设置关闭提示窗口 动态加载UI方式 重写关闭窗体事件 前言 转载 https blog csdn net qq 44703282 article details 119830807 在此链接中介绍了两种重写关闭提示窗体事件的方
  • Python中的面向对象编程的一些基本概念总结

    一 一些专有词汇的定义 面对对象编程 OOP object oriented programming 是一种程序设计范型 同时也是一种程序开发的方法 实现OOP的程序希望能够在程序中包含各种独立而又相互调用的对象 没一个对象又都应该能够接受
  • Python基础语法(函数式编程)

    目录 实例1 温度转换 实例2 蟒蛇绘制 模块1 turtle库 基本图形绘制 基本数据类型 1 整数 浮点数 复数 1 整数 2 浮点数 3 复数 4 数值运算操作符 实例3 天天向上的力量 2 字符串 模块2 time库 时间的基本处理
  • Python3爬虫——用Xpath提取网页信息

    Python3爬虫 用Xpath提取网页信息 前言 本笔记用于记录整理requests库的一些基本知识 内容会根据博主自己的认知作增添或压缩 水平有限 如有错误请不吝赐教 本文需要读者初步了解HTML有关节点的相关知识 文章目录 Pytho
  • ERROR: Could not find a version that satisfies the requirement XXX解决方法

    出现问题 ERROR Could not find a version that satisfies the requirement XXX解决方法 找了很久终于找到能解决这种报错的方法了 直接选用pip源并且信任它的来源就可以解决这种问题

随机推荐